FreeSWITCH使用soundtouch进行变声
FreeSWITCH里面有个mod_soundtouch模块,支持通话实时变声,今天整理下CentOS 7环境下如何使用soundtouch进行实时变声,并提供相关效果演示及资源下载。
我将从以下几个方面进行展开:
- soundtouch介绍
- 基于文件的变声
- mod_soundtouch模块分析
- mod_soundtouch编译及实时变声
- mod_soundtouch的影响及压测思路
一、soundtouch介绍
soundtouch是一个开源的跨平台音频处理库,可以修改音频文件或音频流的音调、播放速率等。
官网:https://www.surina.net/soundtouch/

soundtouch 源码及预编译二进制文件:https://codeberg.org/soundtouch/soundtouch

使用soundtouch库的软件列表:
https://www.surina.net/soundtouch/applications.html

二、基于文件的变声
变声的原理是修改音频的音调或播放速率,这里演示下如何使用基于soundtouch库的软件和python实现。
为了方便起见,这里使用windows进行演示。
操作系统: windows10_x64
文件: original.wav
1、使用Audacity实现变声
Audacity版本: 3.1.3
使用soundtouch库的软件列表里面有Audacity软件,这里演示下如何使用Audacity进行文件变声。
选中音频片段后,根据需要在效果菜单中选中改变节奏、改变速率、改变音高等。界面操作,这里就不过多描述了。

Audacity的使用可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/audacity2022022.html
2、使用soundstretch进行变声
soundtouch官网提供的有soundstretch预编译二进制,下载地址:
https://www.surina.net/soundtouch/download.html

使用示例如下:
soundstretch original.wav output_file.wav -tempo=+15 -pitch=-3
运行效果如下:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024052801 获取。
更多使用示例:
1)变速不变调
soundstretch original.wav out30.wav -tempo=+30 # 加速,时常变短
soundstretch original.wav out30.wav -tempo=-30 # 减速,时常变长
2) 变调不变速
soundstretch original.wav pitch30.wav -pitch=+5 # 音调调高,可以将男声变成女声
soundstretch pitch30.wav normal.wav -pitch=-5 # 音调调低,可以将女声变成男声
3)变速且变调
soundstretch original.wav rate25.wav -rate=+25
3、python使用librosa进行变声
librosa官方网址: https://librosa.org/
文档地址:https://librosa.org/doc/latest/index.html
python版本: 3.9.2
librosa版本: 0.10.2.post1

变声相关函数说明: https://librosa.org/doc/latest/generated/librosa.effects.time_stretch.html

示例代码如下(soundTest1.py):
# --*-- coding:utf-8 --*--
import librosa,soundfile
y,sr = librosa.load("original.wav")
# 改变速度,音频文件时长减半
y_fast = librosa.effects.time_stretch(y, rate=2.0)
soundfile.write("original_f2.wav",y_fast,sr)
# 仅改变音调,音频文件时长不变
y2 = librosa.effects.pitch_shift(y,sr=sr,n_steps=4)
#y2 = librosa.effects.pitch_shift(y,sr=sr,n_steps=-4)
soundfile.write("original_p2.wav",y2,sr)
# 改变速度和音调,音频文件时长减半
soundfile.write("original_x2.wav",y,sr*2)
运行效果如下:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024052802 获取。
三、基于实时流的变声
这里介绍下FreeSWITCH使用编译及使用soundtouch进行变声的过程。
1、mod_soundtouch模块分析
源码路径: src/mod/applications/mod_soundtouch
模块加载函数: mod_soundtouch_load
主要引入 soundtouch 的app和api,分别对应如下函数:
soundtouch_start_function
soundtouch_api_function

函数调用关系:
soundtouch_start_function
=> soundtouch_callback
soundtouch_api_function
=> soundtouch_callback
通过如下函数获取frame数据:
switch_core_media_bug_get_read_replace_frame
switch_core_media_bug_get_write_replace_frame
然后进行变声处理。

2、编译及加载
1) 编译及安装soundtouch库
这里使用soundtouch库版本是 2.3.1 ,最新版本2.3.3在CentOS 7下编译有问题,soundtouch库源码下载地址:
https://codeberg.org/soundtouch/soundtouch/tags

如何编译及注意事项,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240528 获取。
2)编译mod_soundtouch模块
源码里面的 modules.conf 文件启用soundtouch:
applications/mod_soundtouch
然后执行编译操作,大致流程如下:
./rebootstrap.sh
CFLAGS="-O3 -fPIC" ./configure
make -j
make install

CenOS 7环境下编译及安装FreeSWITCH可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/centos7InstallFs20221007.html
3)启用 mod_soundtouch 模块
文件: /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
内容:
<load module="mod_soundtouch"/>
3、使用soundtouch命令
1)soundtouch命令格式
soundtouch <uuid> [start|stop] [send_leg] [hook_dtmf] [-]<X>s [-]<X>o <X>p <X>r <X>t
soundtouch 参数说明:
- uuid
- start|stop
- send_leg
- hook_dtmf
更多参数说明及示例,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240528 获取。
4、变声效果
这里以变调不变速来进行演示。
测试命令:
originate user/1001 &endless_playback(/usr/local/freeswitch/sounds/original.wav) soundtouch e066a874-fa8c-490d-aa53-fb082048f466 start send_leg 4s
soundtouch e066a874-fa8c-490d-aa53-fb082048f466 stop
soundtouch e066a874-fa8c-490d-aa53-fb082048f466 start send_leg -4s
运行效果视频,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024052803 获取。
四、mod_soundtouch的影响及压测思路
python3.9.12版本的ESL编译及使用,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/py39esl-20230424.html
1、mod_soundtouch的影响
由于变声操作会改变音频流的音调或速率,是耗cpu操作,在FreeSWITCH中使用,可能会有如下影响:
1)使用变声功能,cpu使用率会提高(粗测预计提高20%以上);
2)变声后对ASR效果会有影响,主要是准确率、角色分离等;
3)可能会影响音频的清晰度;
2、A打B模式压测思路
A打B模式
1)A呼叫B;
2)B接听后,播放音频流;
3)A侧发送舒适噪音;
这里的A是FS服务器。
- sipp模拟UAS承接呼叫
接通后需要发送音频流给对端(文件uasTest1.tar.gz)。
更长时间pcap文件需自己制作,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/sippPcapTest.html
- FS作为UAC发起呼叫
呼叫命令如下:
originate {tag=test}sofia/external/123456@192.168.137.101:55080 &playback(silence_stream://10000,1400)
- 扫描呼叫列表,对B侧执行变声操作
show calls
soundtouch 39b661f8-46d1-45ba-b049-eda103737515 start 4s
python脚本示例(normalCallST1.py)及会议室压测相关内容可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240528 获取。
五、资源下载
本文涉及文件和示例代码从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240528 获取。

FreeSWITCH使用soundtouch进行变声的更多相关文章
- 音频算法之小黄人变声 附完整C代码
前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...
- 微信变声器(WeChat Voice)会是营销新利器吗
微信变声器(WeChat Voice)2.0 Android版开始内测了,时间从2015年5月20日 - 2015年6月20日,使用微信变声器改变你的声音,并分享给好友! 无论你是想装可爱还是恶搞,微 ...
- 实时语音趣味变声,大叔变声“妙音娘子”Get一下
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏社交化是近年来游戏行业发展的重要趋势,如何提高游戏的社交属性已成为各大游戏厂商游戏策划的重要组成部 ...
- Any to Any 实时变声的实现与落地丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网.微软和数美的技术专家,围绕该话题进行了相关分享. 本文 ...
- FMOD变声如何捕获并存储处理音效之后的数据
类似AVAudioEngine的功能,一个Engine可以将N个connect连接(串联和并联)在一起,这样来实现多个输入源,多层处理效果的混合输出.实现这个所需功能也是通过这样的方案来实现的.也就是 ...
- Python实现变声器功能,萝莉音御姐音都有的哦
登录百度AL开发平台 在控制台选择语音合成 创建应用 填写应用信息 在应用列表获取(Appid.API Key.Secret Key) 6. 安装pythonsdk 安装使用Python SDK有如下 ...
- C# NAudio 变声
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 抠脚大叔如何改变性别,Python实现变声器功能
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- Android中使用speex将PCM录音格式转Wav格式
Android中使用speex将PCM录音格式转Wav格式 2013-09-17 17:24:00| 分类: android | 标签:android speex wav |举报|字号 订阅 ...
- 主流的第三方直播SDK对比(腾讯云、即构、阿里云、声网、网易云信、网宿)
直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...
随机推荐
- 面试连环炮系列(二十️四):为什么选择RocketMQ
为什么选择RocketMQ,而不是其他MQ 性能:阿里支撑,经受住淘宝,天猫双11重重考验:性能高:可靠性好:可用性高:易扩展. 功能:功能完善,我们需要的功能基本都够满足,如:事务消息,消息重试,死 ...
- Hadoop HDFS 3.2的部署
之前写过HDFS 2.6的部署,最近项目中尝试使用最新的HDFS 3.2.1做离线存储,部署方式略有不同,所以这里再简单写一下,这里只涉及到存储因此不再配置yarn,只配置HDFS最基本的服务Name ...
- 力扣304(java)-二维区域和检索-矩阵不可变(中等)
题目: 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) .实现 NumMa ...
- word文档怎么让封面没有页码,页码从正文开始(word 2019)
1.打开需要插入页码的文档,光标放在正文处的开头,然后点击word窗口中的 [布局] ---> 选择[分隔符] -->选择 [分节符] 下面的 [连续]; 2.然后选择word功能区 ...
- OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓
简介: 作为全球数据库领导者,阿里云数据库坚定拥抱开源.此次亮相大会,旗下核心开源项目云原生分布式数据库PolarDB-X通过了信通院的 "可信开源项目评估,并以正式成员身份,加入中国信通院 ...
- 10种编程语言实现Y组合子
简介: Y组合子是Lambda演算的一部分,也是函数式编程的理论基础.它是一种方法/技巧,在没有赋值语句的前提下定义递归的匿名函数,即仅仅通过Lambda表达式这个最基本的"原子" ...
- 作业帮基于 DeltaLake 的数据湖建设最佳实践
简介:作业帮是一家以科技为载体的在线教育公司,其大数据中台作为基础系统中台,主要负责建设公司级数仓,向各个产品线提供面向业务主题的数据信息.本文主要分享了作业帮基于 DeltaLake 的数据湖建设 ...
- 使用ssh连接远程仓库的方法(github)
使用ssh连接远程仓库的方法 但是当我登录虚拟机想提交csapp的代码时,我发现需要验证我的账号密码,感觉每次提交都要输入这个很麻烦.然后就在网上查询了下为何提交代码需要输入账号密码. 使用 HTTP ...
- 使用 Docker 部署 moments 微信朋友圈
1)项目介绍 GitHub:https://github.com/kingwrcy/moments 今天给大家分享一个 类似微信朋友圈 的项目 moments,适合用于记录生活. 2)项目特色 支持匿 ...
- CF1905E One-X
考虑在 \(n\) 个节点的树中,树根作为 \(lca\) 对答案的贡献,显然就是在左子树的叶子中选出一个非空集的方案乘上右子树的方案. \[w(n, id) = id \cdot (2 ^ {L\_ ...