操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9  

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
必选参数,需要进行变声操作leg的uuid
  • start|stop
必选参数,使用start时,后面要跟参数,不能连续两次start,可以在同一个命令里面把所有参数都设置好。
使用stop时,之前必须有start操作。
  • send_leg
可选参数,
不指定该参数时,用于该uuid发出去的音频变声(说的声音变声);
指定该参数时,用于该uuid收到的音频变声(听的声音变声)。
  • hook_dtmf
可选参数
指定该参数时,在电话侧可用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进行变声的更多相关文章

  1. 音频算法之小黄人变声 附完整C代码

    前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...

  2. 微信变声器(WeChat Voice)会是营销新利器吗

    微信变声器(WeChat Voice)2.0 Android版开始内测了,时间从2015年5月20日 - 2015年6月20日,使用微信变声器改变你的声音,并分享给好友! 无论你是想装可爱还是恶搞,微 ...

  3. 实时语音趣味变声,大叔变声“妙音娘子”Get一下

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏社交化是近年来游戏行业发展的重要趋势,如何提高游戏的社交属性已成为各大游戏厂商游戏策划的重要组成部 ...

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

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

  5. FMOD变声如何捕获并存储处理音效之后的数据

    类似AVAudioEngine的功能,一个Engine可以将N个connect连接(串联和并联)在一起,这样来实现多个输入源,多层处理效果的混合输出.实现这个所需功能也是通过这样的方案来实现的.也就是 ...

  6. Python实现变声器功能,萝莉音御姐音都有的哦

    登录百度AL开发平台 在控制台选择语音合成 创建应用 填写应用信息 在应用列表获取(Appid.API Key.Secret Key) 6. 安装pythonsdk 安装使用Python SDK有如下 ...

  7. C# NAudio 变声

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 抠脚大叔如何改变性别,Python实现变声器功能

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  9. Android中使用speex将PCM录音格式转Wav格式

    Android中使用speex将PCM录音格式转Wav格式 2013-09-17 17:24:00|  分类: android |  标签:android  speex  wav  |举报|字号 订阅 ...

  10. 主流的第三方直播SDK对比(腾讯云、即构、阿里云、声网、网易云信、网宿)

    直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...

随机推荐

  1. centos 6.4更新163源

    centos 6.4更新163源   1. 备份现在的源文件    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base. ...

  2. 深入分析C++对象模型之移动构造函数

    接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. C++11新标准 ...

  3. vue-cli4.0 (vue3.0 的脚手架)

    前言: 这个搭建脚手架的话实际是我们创建一个新项目的第一步,当然,现在脚手架4.0都出来了,经过使用后发现跟我们之前的3.0使用方法是答题一样的,其中用vue-cli3.0来搭建我们的项目的话又分为两 ...

  4. 谷歌浏览器新功能 Copy Declaration

    不知道最近大家有没有发现,从谷歌浏览器开发者工具复制 Css 代码到 Vs Code,粘贴之后 Css 代码错乱了.昨天在复制样式代码的时候,突然发现复制的 Css 代码粘贴之后就错乱了.具体表现如下 ...

  5. 第壹課-Install:Mirth Connect在Win10下的安装步骤

    1.安装JDK,推荐安装JDK8 64位,版本jdk-8u201-windows-x64.exe. 安装JDK后,同时必须配置win10的系统环境变量[示例如下]: JAVA_HOME : F:\Ja ...

  6. OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码

    简介: 在数据库OceanBase3.0峰会上,蚂蚁集团自主研发的分布式数据库OceanBase首次从技术.商业和生态三个维度对未来发展战略进行了系统性阐述.同时,OceanBase宣布正式开源,并成 ...

  7. Flink 在爱奇艺广告业务的实践

    简介: 5 月 22 日北京站 Flink Meetup 分享的议题. 本文整理自爱奇艺技术经理韩红根在 5 月 22 日北京站 Flink Meetup 分享的议题<Flink 在爱奇艺广告业 ...

  8. [FAQ] ErrorException of l5-swagger:generate, Required @OA\Info() not found

    l5-swagger 除了要添加 @OA\Get() 针对方法的注释之外,每个 Controller 还需要一个概述信息,如下: /** * @OA\Info( * title="Auth ...

  9. 请查收这份 6.3k star的 Java 攻城狮学习指南!

    大家好,我是 Java陈序员. 自从一入 Java 开发的坑,可谓是每天过得神清气爽(水深火热). 每天不是被项目经理赶进度,就是被测试小姐姐追着改 Bug!都没有时间好好学习(摸鱼)了! 今天给大家 ...

  10. linux 系统tar文件压缩打包命令

    打包成tar.gz格式压缩包 # tar -zcvf renwolesshel.tar.gz /renwolesshel 解压tar.gz格式压缩包 # tar zxvf renwolesshel.t ...