usingSystem.Collections.Generic;
usingSystem.Linq;
usingUnityEngine;
usingSystem.Collections;
[RequireComponent(typeof(AudioSource))]
publicclassRecord:MonoBehaviour
{
publicAudioSourceaudio;
//每秒種產生0.4M數據量
privateLinkedList?recordData?=newLinkedList();
privateAudioClipmicrophoneClip;
privatefloatvoiceDetectLevel?=?0.01f;
privatevoidStart()
{
startMicRecord();
}
privatevoidstartMicRecord()
{
recordData.Clear();
isRecordingMic?=false;
microphoneClip?=Microphone.Start(null,true,?600,?44100);
while(!(Microphone.GetPosition(null)?>?0))
{
}
StartCoroutine("getMicData");
}
privateintlastReadPositio?=?0;
privatefloatmyMax;
privateboolisRecordingMic?=false;
privatefloatclipPlayTime;
IEnumeratorgetMicData()
{
yieldreturnnewWaitForSeconds(0.4f);
//todo?加載數據并分析
intcurrentPosition?=Microphone.GetPosition(null);
intsz?=?currentPosition?-?lastReadPositio;
if(sz?>?1)
{
float[]?d?=newfloat[(sz?-?1)];
microphoneClip.GetData(d,?lastReadPositio);
floatmaxValue?=?0;
foreach(floatsind)
{
maxValue?=?maxValue?>Mathf.Abs(s)???maxValue?:Mathf.Abs(s);
}
myMax?=?maxValue;
Debug.LogError(myMax);
if(isRecordingMic)
{
if(myMax?<?voiceDetectLevel)//每個采集數據的最大值與接近無聲音比較來是否放進采集隊列里面。
{
//nobody?is?talking.
//todo?maybe?to?relay?the?recored?data.
StartCoroutine("replayRecoredData");
//Loom.DispatchToMainThread(replayRecoredData);
StopCoroutine("getMicData");
}
foreach(floatfind)
{
recordData.AddLast(f);
}
}
else
{
if(myMax?>?voiceDetectLevel)
{
isRecordingMic?=true;
recordData.Clear();
foreach(floatfind)
{
recordData.AddLast(f);
}
}
}
}
lastReadPositio?=?currentPosition;
StartCoroutine("getMicData");
}
///
///采集數據?生成clip?,設置屬性?并播放
///
publicvoidreplayRecoredData()
{
Microphone.End(null);
float[]?clipFloats?=newfloat[recordData.Count];
inti?=?0;
foreach(varfinrecordData)
{
clipFloats[i]?=?f;
i++;
}
AudioClipmyClip?=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;
StartCoroutine("waitToRestartMic");
//Loom.StartSingleThread(waitToRestartMic);
}
///
///等待播放時間結束:?后重新錄
///
///
IEnumeratorwaitToRestartMic()
{
yieldreturnnewWaitForSeconds(clipPlayTime);
//Loom.WaitForSeconds(clipPlayTime);
startMicRecord();
}
}
using?System.Collections.Generic;
using?System.Linq;
using?UnityEngine;
using?System.Collections;
[RequireComponent(typeof(AudioSource))]
public?class?Record?:?MonoBehaviour
{
public?AudioSource?audio;
//每秒種產生0.4M數據量
private?LinkedList?recordData?=?new?LinkedList();
private?AudioClip?microphoneClip;
private?float?voiceDetectLevel?=?0.01f;
private?void?Start()
{
startMicRecord();
}
private?void?startMicRecord()
{
recordData.Clear();
isRecordingMic?=?false;
microphoneClip?=?Microphone.Start(null,?true,?600,?44100);
while?(!(Microphone.GetPosition(null)?>?0))
{
}
StartCoroutine("getMicData");
}
private?int?lastReadPositio?=?0;
private?float?myMax;
private?bool?isRecordingMic?=?false;
private?float?clipPlayTime;
IEnumerator?getMicData()
{
yield?return?new?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;
Debug.LogError(myMax);
if?(isRecordingMic)
{
if?(myMax?<?voiceDetectLevel)???//每個采集數據的最大值與接近無聲音比較來是否放進采集隊列里面。
{
//nobody?is?talking.
//todo?maybe?to?relay?the?recored?data.
StartCoroutine("replayRecoredData");
//Loom.DispatchToMainThread(replayRecoredData);
StopCoroutine("getMicData");
}
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;
StartCoroutine("getMicData");
}
///?
///采集數據?生成clip,設置屬性?并播放
///?
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;
StartCoroutine("waitToRestartMic");
//Loom.StartSingleThread(waitToRestartMic);
}
///?
///等待播放時間結束:?后重新錄
///?
///?
IEnumerator?waitToRestartMic()
{
yield?return?new?WaitForSeconds(clipPlayTime);
//Loom.WaitForSeconds(clipPlayTime);
startMicRecord();
}
}