这些代码都是自己测试所用,希望能够跟大家共同学习,有什么疑问或建议,可以给我评论留言........
这是自己写的功能代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SoundTouch;
#if SOUNDTOUCH_INTEGER_SAMPLES
using TSampleType = System.Int16;
using TLongSampleType = System.Int64;
#else
using TSampleType = System.Single;
using TLongSampleType = System.Double;
#endif
public class MicRecord : MonoBehaviour {
private AudioSource Aud;
void Awake(){
Aud = GetComponent<AudioSource> ();
}
//开始录音
public void startRecording(){
if (Microphone.devices.Length < 1){
Debug.Log ("找不到设备!");
return;
}
Microphone.End (null);//停止记录,指定设备
//单纯的创建录音到输出有一定的时间延迟,true可以一直录音,false规定一定录音时间
//创建后已经保存在内存(RAM)临时储存
Aud.clip = Microphone.Start (null, false, 10, 44100);
//在记录样品中获取位置,可以控制延迟
//0秒播放==实时播放录音
while (Microphone.GetPosition (null) <= 0) {};
Aud.Play ();
}
public void stopRecording(){
//录音过程中,从0到时长*频率(44100*10)
//Debug.Log (Aud.timeSamples);
Microphone.End(null);
Aud.Stop();
//#region 音频数据压缩、修改与解压
临时存储,采样(采样率*时间)*声道数
//float[] temporarysave = new float[Aud.clip.samples*Aud.clip.channels];
获取剪辑采样数据,可以将音频转化为float[]数组,进行压缩、变声处理,从offsetsample开始截取
如果从偏移值读取的长度比剪辑长,读取将环绕从剪辑开始读取剩余部分
//Aud.clip.GetData (temporarysave, 0);//从什么时候保存(确认采集数)
//var soundchanger = new SoundTouch<TSampleType,TLongSampleType> ();
//soundchanger.SetSampleRate (44100);
//soundchanger.SetChannels (1);
//soundchanger.SetPitch (2);
//soundchanger.SetRate (2);
//soundchanger.SetTempo (2);
// //快速查找(是否使用快速查找法)
// soundchanger.SetSetting(SettingId.UseQuickseek, 0);
// //抗锯齿过滤器(是否使用AA滤波器)
//soundchanger.SetSetting(SettingId.UseAntiAliasFilter, 0 );
// //滤波器阶数
// soundchanger.SetSetting(SettingId.AntiAliasFilterLength,32);
// //序列持续时间(帧长),用于确定原声在时间延伸算法的切割(速度越慢,数值越大越好)
// soundchanger.SetSetting(SettingId.SequenceDurationMs, 40);
// //查找win持续时间(叠加时寻找窗的范围长度),数值越大越容易获得最佳混音位置,可能会有伪音
// soundchanger.SetSetting(SettingId.SeekwindowDurationMs, 15);
// //重叠持续时间(叠加范围),末端重叠程度
// soundchanger.SetSetting(SettingId.OverlapDurationMs, 8);
// //samp.Length可输入的最大值
// soundchanger.PutSamples (temporarysave, temporarysave.Length);
//float[] resamp = new float[temporarysave.Length];
// //samp.Length可输出的最大值
// soundchanger.ReceiveSamples (resamp, temporarysave.Length);
//soundchanger.Flush ();
Debug.Log(GetComponent<GUILay>().pitchsam);
创建一个给定名称、采样长度、声道和频率的用户音频剪辑。true为流媒体(在iternet上以流式传输的媒体格式)
//Aud.clip = AudioClip.Create("myclip",temporarysave.Length,1,44100,false);
//Aud.clip.SetData (temporarysave,0);//从什么时候播放
// #endregion
#region 测试所用
int duo = Aud.clip.samples * Aud.clip.channels;
Aud.clip = GetComponent<GUILay>().VoiceChanger(Aud.clip, duo);
#endregion
Aud.clip.LoadAudioData ();//加载音频
Debug.Log(Aud.timeSamples);
Aud.Play ();
}
public void SaveRecording(){
}
public void SoundChangering(){
}
}
这是格式代码,主要用了onGUI来写:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SoundTouch;
#if SOUNDTOUCH_INTEGER_SAMPLES
using TSampleType = System.Int16;
using TLongSampleType = System.Int64;
#else
using TSampleType = System.Single;
using TLongSampleType = System.Double;
#endif
public class GUILay : MonoBehaviour {
private MicRecord MicRe;
public float pitchsam = 1f;
public float playbackRate = 1f;
public float tempo = 1f;
void Start(){
MicRe = GetComponent<MicRecord> ();
}
void OnGUI(){
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
if (GUILayout.Button("Recording",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.startRecording ();
}
if (GUILayout.Button("Play",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.stopRecording ();
}
if (GUILayout.Button("Save",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.SaveRecording ();
}
if (GUILayout.Button("Reset",GUILayout.Height(80),GUILayout.Width(200))) {
}
GUILayout.EndVertical();
GUILayout.Space (100);
GUILayout.BeginVertical();
GUILayout.Label ("Pitch/音调" + pitchsam);
pitchsam = GUILayout.HorizontalSlider(pitchsam,-6,6,GUILayout.Width(300),GUILayout.Height(50));
GUILayout.Label ("playbackRate/回调率" + playbackRate);
playbackRate = GUILayout.HorizontalSlider(playbackRate,0,6,GUILayout.Width(300),GUILayout.Height(50));
GUILayout.Label ("tempo/节拍" + tempo);
tempo = GUILayout.HorizontalSlider(tempo,0,6,GUILayout.Width(300),GUILayout.Height(50));
GUILayout.EndVertical();
GUILayout.EndHorizontal();
}
public AudioClip VoiceChanger( AudioClip mycli, int count) {
#region 音频数据压缩、修改与解压
//临时存储,采样音频数据长度*声道数
float[] temporarysave = new float[count];
//获取剪辑采样数据,可以将音频转化为float[]数组,进行压缩、变声处理,从offsetsample开始截取
//如果从偏移值读取的长度比剪辑长,读取将环绕从剪辑开始读取剩余部分
mycli.GetData(temporarysave, 0);//从什么时候保存
var soundchanger = new SoundTouch<TSampleType, TLongSampleType>();
soundchanger.SetSampleRate(44100);
soundchanger.SetChannels(1);
soundchanger.SetPitchSemiTones(pitchsam);
soundchanger.SetRate(playbackRate);
soundchanger.SetTempo(tempo);
//快速查找(是否使用快速查找法)
soundchanger.SetSetting(SettingId.UseQuickseek, 0);
//抗锯齿过滤器(是否使用AA滤波器)
soundchanger.SetSetting(SettingId.UseAntiAliasFilter, 0);
//滤波器阶数
//soundchanger.SetSetting(SettingId.AntiAliasFilterLength, 32);
//序列持续时间(帧长),用于确定原声在时间延伸算法的切割(速度越慢,数值越大越好)
soundchanger.SetSetting(SettingId.SequenceDurationMs, 40);
//查找win持续时间(叠加时寻找窗的范围长度),数值越大越容易获得最佳混音位置,可能会有伪音
soundchanger.SetSetting(SettingId.SeekwindowDurationMs, 15);
//重叠持续时间(叠加范围),末端重叠程度
soundchanger.SetSetting(SettingId.OverlapDurationMs, 8);
//samp.Length可输入的最大值
soundchanger.PutSamples(temporarysave, temporarysave.Length);
float[] resamp = new float[temporarysave.Length];
//samp.Length可输出的最大值
soundchanger.ReceiveSamples(resamp, temporarysave.Length);
soundchanger.Flush();
//Debug.Log(GetComponent<GUILay>().pitchsam);
//创建一个给定名称、采样长度、声道和频率的用户音频剪辑。true为流媒体(在iternet上以流式传输的媒体格式)
AudioClip myclip = AudioClip.Create("myclip", temporarysave.Length, 1, 44100, false);
myclip.SetData(temporarysave, 0);//从什么时候播放
#endregion
Debug.Log(myclip);
return myclip;
}
}