这是基于soundtouch写的一个实时变声的C#脚本,因为是调试版,所以可能会有BUG

核心代码:

private void OnAudioFilterRead(float[] data, int channels){if (isRecording){//根据data,一段段处理变声soundTouch.PutSamples(data, data.Length);float[] tempsample_after = new float[data.Length];soundTouch.ReceiveSamples(tempsample_after, data.Length);for (int i = 0; i < data.Length; i++){data[i] = tempsample_after[i];}}}

关于OnAudioFilterRead的问题,有兴趣的同学可以去看看它的API,我在这里就不多说了

下面直接代码:

using SoundTouch;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;#if SOUNDTOUCH_INTEGER_SAMPLES
using TSampleType = System.Int16;
using TLongSampleType = System.Int64;
#else
using TSampleType = System.Single;
using TLongSampleType = System.Double;
#endifpublic class ClipChangeTest : MonoBehaviour {public AudioSource audioSource;//滑动条public Slider slider1;public Slider slider2;public Slider slider3;//输入框public InputField inputField1;public InputField inputField2;public InputField inputField3;public InputField inputField_modelName;private float tmpTempo;private float tmpPitch;private float tmpRate;private float temp_ischange1;private float temp_ischange2;private bool isRecording = false;private bool isChange_pitch = false;SoundTouch soundTouch = new SoundTouch();// Use this for initializationvoid Start (){slider1.minValue = -12f;slider1.maxValue = 12f;slider2.minValue = 0f;slider2.maxValue = 6f;slider3.minValue = 0f;slider3.maxValue = 6f;slider1.value = 0f;slider2.value = 1f;slider3.value = 1f;}// Update is called once per framevoid Update () {if (!isChange_pitch){if (slider3.value != temp_ischange2){slider2.value = 1f / slider3.value;temp_ischange1 = slider2.value;temp_ischange2 = slider3.value;}else if (slider2.value != temp_ischange1){slider3.value = 1f / slider2.value;temp_ischange1 = slider2.value;temp_ischange2 = slider3.value;}if (inputField1.isFocused){slider1.value = float.Parse(inputField1.text);}else if(inputField2.isFocused){slider2.value = float.Parse(inputField2.text);}else if (inputField3.isFocused){slider3.value = float.Parse(inputField3.text);}else{inputField1.text = slider1.value.ToString();inputField2.text = slider2.value.ToString();inputField3.text = slider3.value.ToString();}tmpPitch = slider1.value;tmpTempo = slider2.value;tmpRate = slider3.value;}}public void Mic_test(){if (Microphone.devices.Length == 0){Debug.LogWarning("找不到麦克风!");}Microphone.End(null);audioSource.clip = Microphone.Start(null, false, 100, 44100);//实时变声调整(初始化)isChange_pitch = true;soundTouch.SetTempo(tmpTempo);soundTouch.SetPitchSemiTones(tmpPitch);//噪音相对大一点soundTouch.SetRate(tmpRate);soundTouch.SetSampleRate(44100);soundTouch.SetChannels(1);soundTouch.SetSetting(SettingId.UseQuickseek, 0);soundTouch.SetSetting(SettingId.UseAntiAliasFilter, 0);soundTouch.SetSetting(SettingId.SequenceDurationMs, 40);soundTouch.SetSetting(SettingId.SeekwindowDurationMs, 15);soundTouch.SetSetting(SettingId.OverlapDurationMs, 8);isRecording = true;while (Microphone.GetPosition(null) <= 0) { }audioSource.Play();}//保存声音public void Save_test(){soundTouch.Flush();float[] saveClip_befor = new float[audioSource.timeSamples];audioSource.Stop();audioSource.clip.GetData(saveClip_befor, 0);//变声处理soundTouch.SetTempo(tmpTempo);soundTouch.SetPitchSemiTones(tmpPitch);soundTouch.SetRate(tmpRate);soundTouch.SetSampleRate(44100);soundTouch.SetChannels(1);soundTouch.SetSetting(SettingId.UseQuickseek, 0);soundTouch.SetSetting(SettingId.UseAntiAliasFilter, 0);soundTouch.SetSetting(SettingId.SequenceDurationMs, 40);soundTouch.SetSetting(SettingId.SeekwindowDurationMs, 15);soundTouch.SetSetting(SettingId.OverlapDurationMs, 8);soundTouch.PutSamples(saveClip_befor, saveClip_befor.Length);//获取变声后的数据并保存float[] saveClip_after = new float[saveClip_befor.Length];soundTouch.ReceiveSamples(saveClip_after, saveClip_befor.Length);soundTouch.Flush();audioSource.clip = AudioClip.Create("changedClip", saveClip_befor.Length, 1, 44100,false);audioSource.clip.SetData(saveClip_after, 0);SavWav.Save("test1", audioSource.clip);isChange_pitch = false;}//实时变声private void OnAudioFilterRead(float[] data, int channels){if (isRecording){//根据data,一段段处理变声soundTouch.PutSamples(data, data.Length);float[] tempsample_after = new float[data.Length];soundTouch.ReceiveSamples(tempsample_after, data.Length);for (int i = 0; i < data.Length; i++){data[i] = tempsample_after[i];}}}//控制录音时是否有声音public void ChangeController(){if (audioSource.volume == 0){audioSource.volume = 1;}else{audioSource.volume = 0;}}//测试所用//回放public void replay(){isChange_pitch = false;isRecording = true;//实时变声调整(初始化)soundTouch.SetTempo(tmpTempo);soundTouch.SetPitchSemiTones(tmpPitch);//噪音相对大一点soundTouch.SetRate(tmpRate);soundTouch.SetSampleRate(44100);soundTouch.SetChannels(1);soundTouch.SetSetting(SettingId.UseQuickseek, 0);soundTouch.SetSetting(SettingId.UseAntiAliasFilter, 0);soundTouch.SetSetting(SettingId.SequenceDurationMs, 40);soundTouch.SetSetting(SettingId.SeekwindowDurationMs, 15);soundTouch.SetSetting(SettingId.OverlapDurationMs, 8);audioSource.Play();}//保存不同的音色public void Save_changedata(){if (!File.Exists(Application.dataPath + "/Assets/Resources/speech_model.txt")){File.Create(Application.dataPath + "/Assets/Resources/speech_model.txt");Debug.LogWarning("创建文件");}FileStream fileStream = new FileStream(Application.dataPath + "/Assets/Resources/speech_model.txt",FileMode.Append);StreamWriter streamWriter = new StreamWriter(fileStream);streamWriter.Write(inputField_modelName.text + ": ");streamWriter.Write(" pitch:" + tmpPitch);streamWriter.Write(" tempo:" + tmpTempo);streamWriter.Write(" rate:" + tmpRate);streamWriter.WriteLine();streamWriter.Close();Debug.Log("保存音色数据成功!");}}
项目下载链接: http://download.csdn.net/download/weifut/9966784

unity3D学习之音频播放 、实时变声简化版-audio菜鸟笔记5相关推荐

  1. Python实时变声教程:用代码实现自定义音频处理效果

    如何使用Python编写实时变声程序 随着人们对音频处理技术的需求越来越高,音频处理技术在各个领域的应用也越来越广泛.其中,实时变声技术是一种比较有趣的音频处理技术.本文将介绍如何使用Python编写 ...

  2. Any to Any 实时变声的实现与落地丨RTC Dev Meetup

    前言 「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网.微软和数美的技术专家,围绕该话题进行了相关分享. 本文 ...

  3. 音频社交的变声,应用了哪些算法?

    导读:2021开年以来,音频社交市场伴随着Clubhouse的爆火再获资本的关注,国内相关产品荔枝.映客都迎来了股价的大幅上涨,预计未来音频化在社交领域还会有长期且广泛的需求. 在移动互联网技术加持下 ...

  4. 【AI实时变声器,声音甜甜的小姐姐背后竟是抠脚大汉】

    前言 这是一款基于AI算法的实时变声器,如果你不懂AI也没事,直接使用我提供的一键安装包 链接:https://pan.baidu.com/s/1f3X6JdBVOgeTNPf0B3CRKg 提取码: ...

  5. 【毕业设计系列】033:基于MATLAB语言的实时变声器系统【含Matlab源码】

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  6. 【毕业设计/Matlab系列】基于MATLAB语言的实时变声器系统

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  7. unity3D学习之音频数据的采集要点-audio菜鸟笔记6

    之前的那些博文都只是很粗糙的知识跟一些自己的练习而已,这次我将介绍一下自己用过的音频数据采集的方法: 1.AudioClip.GetData(a, b) 可以直接从AudioSource组件中的音频文 ...

  8. vue2.x 音频播放器 使用element ui + Audio实现一款完整的音频播放器

    项目背景 audio 音频播放在多媒体开发中非常常见,但是实际项目中你就会发现,每个系统的audio音频界面都长的不一样,百花齐放... pw怎么会同意呢[哈哈],马上掏出手机,你改成长这个样子就好了 ...

  9. Unity3d学习之音频

    在游戏中,音效是必不可少的.游戏中的音频分为背景音乐和环境音乐两种. 背景音乐即贯穿全场的音乐,而环境音乐则是特定的,比如水流声,动物的叫声,只有你靠近时才能听得到的声音. unity3d中目前支持4 ...

最新文章

  1. 微软中国 CTO:请把 AI 拉下神坛
  2. 嵌入式C语言基础教程一
  3. 控制论python_[干货]深入浅出LSTM及其Python代码实现
  4. matlab 画箱线图boxplot简单用法
  5. Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)
  6. 年薪不到 25.2 万退学费,廖雪峰的“大数据高级开发”课程招生
  7. 简单web服务器的实现(C++)
  8. 文件内存映射(一):它是什么
  9. centos 7 拉黑IP
  10. 二级公共基础知识总结笔记
  11. Linux九阴真经之大伏魔拳残卷5 nginx
  12. 微信公众号的基本排版设置
  13. Hibernate对原生sql处理及结果集和VO的映射
  14. EasyRecovery 15 mac中文免费密钥数据恢复 安装软件的方法教程及版本对比
  15. 影视处理计算机配置,影视后期制作需要什么样的电脑配置
  16. Unity3D-获取字体的实际像素宽高
  17. 带你轻松写出第一篇优秀论文
  18. 怎样测试IP 是否在
  19. Java回调函数异步回调案例
  20. eclipse grade配置

热门文章

  1. 上海全市实景被搬到韩国赛车网游中
  2. 徐家骏:我在华为工作十年的感悟(转载)
  3. VCSA 6.5 fails to start File System Check and Network Service
  4. 免费的天气API接口 获取今日, 未来3天, 未来7天天气预报数据
  5. 南方电网2018校园招聘计算机类岗位面试、笔试经历
  6. Android系统级开发进程清理功能的一些记录和发现
  7. VIEWGOOD(远古)大科普:直播观看自由掌控的直播时移技术介绍
  8. linux prime,Linux – Prime95 (MPrime)
  9. gstreamer应用笔记
  10. 取消微软浏览器工具栏的发现按钮