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 LinkedList<float>();
    private AudioClip microphoneClip;
    private float voiceDetectLevel = 0.2f;

    private void Start()
    {
        startMicRecord();
    }

    private void startMicRecord()
    {
        recordData.Clear();
        isRecordingMic = false;
        microphoneClip = Microphone.Start(null, true, 600, 44100);
        while (!(Microphone.GetPosition(null) > 0))
        {
        }
        Loom.StartSingleThread(getMicData);
    }

    private int lastReadPositio = 0;
    private float myMax;
    private bool isRecordingMic = false;
    private float clipPlayTime;

    private void getMicData()
    {
        Loom.WaitForSeconds(0.4f);
        //todo 加载数据并分析
        int currentPosition = Microphone.GetPosition(null);
        int sz = currentPosition - lastReadPositio;
        if (sz > 1)
        {
            float[] d = new float[(sz - 1)];
            microphoneClip.GetData(d, lastReadPositio);
            float maxValue = 0;
            foreach (float s in d)
            {
                maxValue = maxValue > Mathf.Abs(s) ? maxValue : Mathf.Abs(s);
            }
            myMax = maxValue;
            if (isRecordingMic)
            {
                if (myMax < voiceDetectLevel)
                {
                    //nobody is talking.
                    //todo maybe to relay the recored data.
                    Loom.DispatchToMainThread(replayRecoredData);
                    return;
                }
                foreach (float f in d)
                {
                    recordData.AddLast(f);
                }
            }
            else
            {
                if (myMax > voiceDetectLevel)
                {
                    isRecordingMic = true;
                    recordData.Clear();
                    foreach (float f in d)
                    {
                        recordData.AddLast(f);
                    }
                }
            }
        }
        lastReadPositio = currentPosition;
        //
        getMicData();
    }

    public void replayRecoredData()
    {
        Microphone.End(null);
        float[] clipFloats = new float[recordData.Count];
        int i = 0;
        foreach (var f in recordData)
        {
            clipFloats[i] = f;
            i++;
        }
        AudioClip myClip = AudioClip.Create("tom", clipFloats.Length, 1, 44100, false, false);
        myClip.SetData(clipFloats, 0);
        audio.clip = myClip;
        audio.Play();
        audio.loop = false;
        audio.pitch = 1.2f;
        clipPlayTime = clipFloats.Length / 44100.0f;
        Loom.StartSingleThread(waitToRestartMic);

    }

    private void waitToRestartMic()
    {
        Loom.WaitForSeconds(clipPlayTime);
        startMicRecord();
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10 * 2, 100, 20), "audio" + audio);
        //        GUI.Label(new Rect(10, 10 * 3, 100, 20), "audio" + audio.clip);
        //        GUI.Label(new Rect(10, 10 * 4, 100, 20), "audio" + audio.clip.samples);
        //        GUI.Label(new Rect(10, 10 * 5, 100, 20), "audio" + audio.clip.samples.ToString());
        GUI.Label(new Rect(10, 10 * 6, 100, 20), "mic pos:" + Microphone.GetPosition(null));
        GUI.Label(new Rect(10, 10 * 7, 100, 20), "myMax:" + myMax);
        GUI.Label(new Rect(10, 10 * 8, 100, 20), "recordData:" + recordData.Count());

    }
}

完整项目地址:

http://download.csdn.net/detail/chh19941125/8744043

时间: 2024-12-14 06:25:55

unity汤姆猫自动检测录音,不说话自动播放的相关文章

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

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

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

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

汤姆猫的安装、使用。

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

[UI基础][不会说话的汤姆猫]

会说话的汤姆猫这个APP层级风靡一时,其UI部分就是利用了序列动画的技术, 接下来 我们用汤姆猫来演示怎么制作序列动画. [要求]: 1.学会使用序列动画的方法 2.学会分析动画播放中内存占用高的问题,并解决 [实现] 1.搭建UI界面 1.1.设置模拟器的屏幕尺寸3.7,添加素材 我们的素材文件是是按照3.7Inch的大小,设置屏幕大小为3.7Inch,添 加动画的素材到工程. 2.2.添加控件 2.2.1.添加背景图片 我们用ImageView控件来实现动画,首先添加一个UIViewImag

OC:不会说话的汤姆猫(2014年12月)未添加音频

代码下载地址:http://download.csdn.net/detail/ytuzhangziyao/8313977 1.第一种方法 /* 不会说话的汤姆猫 1.图片名放在button的title中,提取出来用sender.currentTitle 2.每个文件夹中的图片个数存在button的tag值中,提取出来用sender.tag */ - (IBAction)clickBtn:(UIButton *)sender { NSMutableArray *ary = [NSMutableAr

在汤姆猫上运行服务

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/objective-c

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *tomImageView; @end @implementation ViewController //敲汤姆猫的头部.前提:一系列动画已经导入. (IBAction)btnKnockOutonclicked:(UIButton *)sender{ [self tomImate

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

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

iOS开发:纯代码实现汤姆猫小游戏

演示效果如下: 代码如下: 1 // 2 // CKViewController.m 3 // 纯代码实现汤姆猫 4 // 5 // Created by FrankChen on 14-12-10. 6 // Copyright (c) 2014年 diaozhatian. All rights reserved. 7 // 8 9 #import "CKViewController.h" 10 11 @interface CKViewController () 12 { 13 //