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站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...
随机推荐
- mysql 重新整理——存储引擎[三]
前言 要知道存储引擎这个东西,不是存储的意思,而是io操作. MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛 ...
- MyBatis 核心配置讲解(上)
大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠. 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了. 从今天开始,我们正式进入 M ...
- 使用ISS服务器方式跑C#程序
使用ISS服务器方式跑C#程序 VS2010,临时接了一个C#系统的小系统,需要本地调试跑一下 但是老是在conn.open提示06413,简单来说就是连接不上数据库 尝试了很多方法,最后还是决定配置 ...
- Oracle 数据库误删操作闪回
Oracle 数据库误删操作闪回 闪回功能是内置的,类似于服务器快照,看运气要在的数据在不在 select * from testtable as of timestamp to_timestamp( ...
- 力扣1082(MySQL)-销售分析Ⅰ(简单)
题目: 产品表:Product 销售表:Sales 编写一个 SQL 查询,查询总销售额最高的销售者,如果有并列的,就都展示出来. 以 任意顺序 返回结果表. 查询结果格式如下所示. Product ...
- App DApp Deploy as Code! SAE & Terraform 实现 IaC 式部署应用eploy as Code! SAE & Terraform 实现 IaC 式部署应用
简介: SAE 和 Terraform 的结合,能够帮助企业像处理代码一样管理自己的应用,对资源的操作都变得可审计,可追溯,可回滚,同时也降低人为操作带来的风险. 企业上云是近些年的发展热潮,越来越多 ...
- DataWorks开发ODPS SQL开发生产环境自动补全ProjectName
简介: DataWorks标准模式下,支持开发环境和生产环境隔离,开发环境和生产环境的数据库表命名有所区别,如果需要在开发环境访问生产环境的数据库表或者跨项目空间访问其他项目空间的表,需要根据proj ...
- CNCF 沙箱项目 OCM Placement 多集群调度指南
简介:在这篇文章中,将介绍 Placement 如何选择到所需的集群,Placement 可以提供的调度功能,以及一些场景下的最佳实践,使用者可以参考示例来编写符合自己要求的 Placement.其 ...
- EventBridge 特性介绍|以 IaC 的方式使用 EventBridge
简介:本文将重点介绍 EventBridge 和 IaC 的重点概念和特性,然后演示如何应用 IaC 理念自动化部署 EventBridge 来使用这些概念和特性. 作者:王川(弗丁) 引言 Eve ...
- 贝壳基于 Flink 的实时计算演进之路
简介: 贝壳找房在实时计算之路上的平台建设以及实时数仓应用. 摘要:贝壳找房大数据平台实时计算负责人刘力云带来的分享内容是贝壳找房的实时计算演进之路,内容如下: 发展历程 平台建设 实时数仓及其应用场 ...