操作系统 :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. 4天带你上手HarmonyOS ArkUI开发

    本次HarmonyOS ArkUI入门训练营课程--健康生活实战篇,手把手教大家如何制作一个合理膳食的APP前端Demo! 课程实战样例通过ArkUI声明式UI开发框架实现,只需用几行简单直观的声明式 ...

  2. Spring Cloud Bus:消息总线

    Spring Cloud Bus:消息总线 SpringCloud学习教程 SpringCloud Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播 ...

  3. 重新点亮shell————函数[七]

    前言 简单整理一下函数. 正文 自定义函数: function fname(){ 命令 } 函数的执行: fname 函数作用范围的变量: local 变量名 函数的参数 $1 $2 $3 .... ...

  4. HBuilderX 连接网易mumu手机模拟器进行App开发

    1.下载安装手机模拟器 常见的安卓手机模拟器: 手机模拟器名称 对应端口号 夜神模拟器 62001 天天模拟器 6555 海马玩模拟器 26944 逍遥模拟器 21503 网易mumu模拟器 7555 ...

  5. oracle SQL 进行时间冲突判断

    oracle SQL 进行时间冲突判断 背景:写一个预约模块,主要的限制就是时间限制,有冲突的时间段就不能进行预约 设数据库中的时间为A开始,A结束 设要判断的时间为B开始,B结束 则判断有在B开始时 ...

  6. 面试题45(Java)-把数组排成最小的数(中等)

    题目: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [ ...

  7. 详解 Flink 容器化环境下的 OOM Killed

    简介: 本文将解析 JVM 和 Flink 的内存模型,并总结在工作中遇到和在社区交流中了解到的造成 Flink 内存使用超出容器限制的常见原因.由于 Flink 内存使用与用户代码.部署环境.各种依 ...

  8. 阿里巴巴超大规模 Kubernetes 基础设施运维体系揭秘

    ​简介:ASI 作为阿里集团.阿里云基础设施底座,为越来越多的云产品提供更多专业服务,托管底层 K8s 集群,屏蔽复杂的 K8s 门槛.透明几乎所有的基础设施复杂度,并用专业的产品技术能力兜底稳定性, ...

  9. Docker Desktop v20.10.8 和 WSL2 迁移镜像存储目录

    只迁移存储镜像和挂载文件目录:https://www.cnblogs.com/lemonK/p/17781775.html 同时迁移docker程序目录:https://www.cnblogs.com ...

  10. [FAQ] golang-migrate/migrate error: default addr for network '127.0.0.1:3306' unknown

    按照项目github文档上所示,在使用 mysql 时你可能会这样写: $ migrate -path db/migrations -database mysql://root:123456@127. ...