用Unity写了一个类似汤姆猫自动检测说话功能

简单的把脚本加到摄像机上就行

下面是我写的脚本,有个问题 因为是自动调用检测的 调用录音unity调用有延时 会出现一些延时小问题,可以参考我的代码 改改 做个通过按钮点击录音结束播放录音还是能实现的

using System.Collections.Generic;
using UnityEngine;
using System.Collections;

public class Tom2 : MonoBehaviour
{
    //public float power = 1;
    //public float min = 0;
    // public AudioClip audioClip = null;//AudioClip音频剪辑
    //public AudioSource audioSource;//AudioSource 音频源
    public bool audioclipWorking = false;
    public string audioIsPlaying;

    public bool microphoneWorking = false;
    private List<float> samplesList; //播放数据存储

    public float samplesMaxValue;
    public int ClipLength;

    private void Start()
    {
        samplesList = new List<float>(); //不固定
        startRecord();
    }

    private void Update()
    {
        audioIsPlaying = audio.isPlaying.ToString();
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
        if (microphoneWorking)
        {
            if (!Microphone.IsRecording(null))
            {
                microphoneWorking = false;
                JudgeRecord();
            }
        }
        if (audioclipWorking)
        {
            if (audio.isPlaying == false)
            {
                samplesList.Clear();
                startRecord();
                audioclipWorking = false;
            }
        }
    }

    private void startRecord()
    {
        audio.clip = Microphone.Start(null, false, 1, 44100);
        while (Microphone.GetPosition(null) <= 0) ;
        microphoneWorking = true;
    }

    public void JudgeRecord()
    {
        float max = 0;
        float[] tempSamples; //临时数据存储
        tempSamples = new float[audio.clip.samples * audio.clip.channels];
        audio.clip.GetData(tempSamples, 0);
        foreach (float s in tempSamples)
        {
            float m = Mathf.Abs(s);
            if (max < m)
            {
                max = m; //刚刚录制音频数据的取最大值
            }
        }
        samplesMaxValue = max;
        if (max > 0.1)
        {
            //判断有人说话
            startRecord();
            foreach (float e in tempSamples)
            {
                samplesList.Add(e);//保存数据
            }
            //再录下一秒
        }
        else
        {

            //无人说话
            if (audio.clip != null && samplesList != null)
            {
                if (samplesList.Count > 1000)
                {
                    AudioClip myClip = AudioClip.Create("tom", samplesList.Count, 1, 44100, false, false);
                    myClip.SetData(samplesList.ToArray(), 0);
                    audio.clip = myClip;
                    audio.loop = false;
                    audio.pitch = 1.2f;
                    audio.Play();
                    audioclipWorking = true;
                }
                else
                {
                    startRecord();
                }
            }
            else
            {
                startRecord();
            }
        }
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(60, 30 * 1, Screen.width, 20), "samplesMaxValue:" + samplesMaxValue);
        GUI.Label(new Rect(60, 30 * 2, Screen.width, 20), "ClipLength:" + ClipLength);
        GUI.Label(new Rect(60, 30 * 3, Screen.width, 20), "audioIsPlaying:" + audioIsPlaying);
        GUI.Label(new Rect(60, 30 * 4, Screen.width, 20), "audioclipWorking:" + audioclipWorking);
        GUI.Label(new Rect(60, 30 * 5, Screen.width, 20), "microphoneWorking:" + microphoneWorking);
        GUI.Label(new Rect(60, 30 * 6, Screen.width, 20), "audio.clip.samples:" + audio.clip.samples);
        GUI.Label(new Rect(60, 30 * 7, Screen.width, 20), "audio.clip.length:" + audio.clip.length);
        GUI.Label(new Rect(60, 30 * 8, Screen.width, 20), "audio.clip.channels:" + audio.clip.channels);
        GUI.Label(new Rect(60, 30 * 8, Screen.width, 20), "Microphone.GetPosition:" + Microphone.GetPosition(null));
    }
}
时间: 2024-10-27 12:40:52

用Unity写了一个类似汤姆猫自动检测说话功能的相关文章

unity汤姆猫自动检测录音,不说话自动播放

unity汤姆猫自动检测录音,不说话自动播放 脚本 using System.Collections.Generic; using System.Linq; using UnityEngine; [RequireComponent(typeof(AudioSource))] public class MicrophoneInput : MonoBehaviour { //每秒种产生0.4M数据量 private LinkedList<float> recordData = new Linked

一个不会说话的汤姆猫游戏源码

实现“会说话的汤姆猫” App 互动效果,除了不能发出声音,动画效果与原App十分类似.基本原理是,根据选择的不同动作,播放对应的图像序列.支持图片缓存. 游戏项目源码下载:http://code.662p.com/view/7150.html 详细说明:http://ios.662p.com/thread-1874-1-2.html

IOS 开发笔记-基础 UI(7)汤姆猫(UIImageView 的序列帧动画、图片加载,方法重构、Bundle 图片素材)

使用UIImageView.UIButton实现一个综合小案例---汤姆猫 回忆:UIImageView 来自UIView,UIView 来自UIResponder,UIButton 来自UIControl,UIControl 来自UIView 单独看实现,代码实现其实比较简单,但是创意很难得,美工要求很高! 是一个了不起的游戏! 功能分析 (1)点击对应的按钮后,让汤姆猫展现对应的动画 步骤分析 (1)搭建UI界面,同时也是准备素材 (2)监听按钮点击 (3)根据点击的按钮执行对应的动画 说明

[iOS基础控件 - 3.4] 汤姆猫

需求: 1.点击按钮播放相应动画 2.点击汤姆猫身体部分(头.脚.尾巴)显示动画 3.当前正在播放动画不可触发其他动画 4.优化缓存.内存管理 A.序列帧动画 #1. png格式的文件可以不带扩展名访问,而且可以放到”Images.scassets”的组中预览,jpg只能放到support file中了,而且访问的时候要写上扩展名 #2. 在ViewController中的属性栏可以设置storyboard模型的大小 #3. 拖入文件夹的时候要选择“Create Groups"才能正确引用,不要

在汤姆猫上运行服务

1.cd /usr/local/tomcat/ 2.在此基础上可以创建几个目录,分别叫/tomcat/webapps,在webapps创建libincla目录,并在此目录下分别创建/WEB-INF和并在WEB-INF之下分别创建/classes和/lib,代表我们要部署一个服务了. mkdir /tomcat/webapps –pv cd webapps mkdir libincla [[email protected] libincla]# tree WEB-INF/ WEB-INF/ ├──

IOS 学习04 汤姆猫开发

IOS开发,一个简单的汤姆猫开发,截图如下: 1.1以前一直觉得这个小游戏不错,很好玩,现在学习IOS才发现其实这个程序真心很简单,其实这个还不是个完整,还没有声音,以后再来完整. 1.2 创建项目,导入图片,在项目images.xcassets中保存PNG图片,这里只保存6个按键图片,图片文件直接拉进就可以,如下图: 1.3 相信大多数人都玩过这个小游戏,其实这就是一个动画,而动画就是由多个图片连在一起播放的,最后看起来就是动画了. 1.4 知道了动画的原理,那就好办了,我们再来导入按键相对应

声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码

上周看到一个变调算法,挺有意思的,原本计划尝试用来润色TTS合成效果的. 实测感觉还需要进一步改进,待有空再思考改进方案. 算法细节原文,移步链接: http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/ C++开源的项目,比较老的一个项目了. 源码下载地址: http://blogs.zynaptiq.com/bernsee/download/ 本人对这份算法源码进行简单的优化调整. 稍微提升了一点性能. 修改后的完整代码:

用树莓派实现会说话的汤姆猫

会说话的汤姆猫很多人都玩过,对着它说话,它就会用猫的音调重复你说的话.这篇文章就是介绍如何使用树莓派来实现这个功能. 测试设备: 树莓派3B+ ReSpeaker 2-Mics Pi HAT(USB的麦克风应该也可以) 耳机/音箱(需要带插头的) 1.ReSpeaker硬件安装 ReSpeaker是直接扣在树莓派上的,将树莓派的针脚全部插入到ReSpeaker中. 2.ReSpeaker驱动安装 通过SSH连接到树莓派后,首先更新包源,然后安装git,下一步会使用git下载代码: sudo ap

汤姆猫的安装、使用。

先要提供jdk-7u9-linux-x64.rpm(如以上版本) 安装jdk(java需要用到的编译开发工具) [[email protected] ~]# rpm -vih jdk-7u9-linux-x64.rpm Preparing...                ########################################### [100%]    1:jdk                    #################################