在FreeSwitch中播放语音流,主要通过API指令和脚本方式实现语音相关的播放和录制等控制。在实际应用过程中根据业务需要,选择适合自己的方式进行处理。
第一、概述:
1,内置语音库
FreeSwitch支持多种音频格式,WAV、MP3、GSM等,把音频文件放在服务器上,通过相关指令进行播放相关文件。
如果把语音文件放在云服务器上如阿里云的OSS上等,在进行播放时,会有很大的噪音:
bgapi originate user/1004 &playback(https://bjpshop.oss-rg-china-mainland.aliyuncs.com/audio/error.wav)
bgapi uuid_broadcast 9d936ccc-20d3-421b-85ab-cfe26b72cdf8 https://bjpshop.oss-rg-china-mainland.aliyuncs.com/audio/major.wav
本地文件的默认语音文件的目录在vars.xml中可以看到
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
<!--<Z-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/allison"/> -->
2,IVR(Interactive Voice Response)交互式语言应答
FreeSwitch提供强大的IVR功能,可以使用XML文件或Lua脚本实现交互式语音菜单,播放录制好的音频。在一般的CTI应用系统中,都会有IVR(交互式语音应答系统)。IVR系统是呼叫中心的重要组成部分,通过IVR系统,用户可以利用音频按健电话输入信息,从系统中获得预先录制的数字或合成语音信息。具有TTS功能的IVR可以加快服务速度,节约服务成本,使IVR为呼叫者提供7*24小时的服务。
3,TTS(Text To Speech的缩写)
将文本实时转化为音频,在通话中播放生成的音频流。目前常见的音频流很多,如百度、阿里和腾讯都提供强大的文字转音频。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。
一个典型的包含TTS服务的电话服务流程可分为:
用户电话拨入,系统IVR响应,获得用户按键等信息。
IVR根据用户的按键信息,向数据库服务器申请相关数据。
数据库服务器返回文本数据给IVR。
IVR通过其TCP通讯接口,将需要合成的文本信息发送给TTS服务器。
TTS服务器将用户文本合成的语音数据分段通过TCP通讯接口发送给IVR服务器。
IVR服务器把分段语音数据组装成为独立的语音文件。
IVR播放相应的语音文件给电话用户。
一般的公网接入(IVR)大都采用工控机+语音板卡,而合成的语音数据则通过局域网传给IVR。这种结构只适用于简单的应用场合。
4,音频流
FreeSwitch支持外部的流媒体服务器,借助流媒体可以实现语音播放。
第二、播放实例
方法一:使用API
1,originate命令播放语音:
bgapi originate user/1004 &playback(major.wav)
说明:异步单腿拨通1004客服,接通后播放major.wav背景音乐,播完后自动挂断。playback函数可以借助 file_string 实现多段音频播放。在 FreeSWITCH 中比较典型的是播放录音文件的 playback 和 play_and_detect_speech 。这两个播放录音的功能都依赖于 switch_ivr_play_say.c#switch_ivr_play_file() 函数,而该函数可以借助 file_string 实现多段音频播放,示例如下:
originate user/1000 &playback(file_string://ivr/8000/ivr-welcome1.wav!ivr/8000/welcome2.wav)
提醒:file_string://
前缀不能省略,这个代表的是 FreeSWITCH 中的一个文件管理模块,多个音频文件用 ! 拼起来即可。注意如果文件名中含有 ! 符号,也可以使用通道变量 playback_delimiter
来修改文件间的分隔符号
2,uuid_broadcast命令播放语音:
在一个指定UUID的信道上执行任意一个拨号方案程序。如果指定了某录音文件名,则代表将会在该信道上播放该文件。 执行拨号方案程序的语法规则是“app::args”。
uuid_broadcast <uuid> <path> [aleg|bleg|both]
在选定的腿上执行应用程序,执行完毕后挂断,并指明挂机原因。
uuid_broadcast <uuid> app[![hangup_cause]]::args [aleg|bleg|both]
基本用法:
uuid_broadcast 873af3a3-9ab9-406d-b485-26bbadaec93c major.wav
uuid_broadcast 9d936ccc-20d3-421b-85ab-cfe26b72cdf8 major.wav
说明:如果信道上有很多其他的音频,会逐个播放。具体在实际应用种如何使用,可以了解
uuid_break、uuid_buglist和uuid_displace等相关指令,配合使用。
方法二、使用Lua脚本播放音频
1、使用方法:session:execute(app,data)
local mySound = "/usr/local/freeswitch/sounds/music/16000/major.wav"
session:execute("playback", mySound)
说明:使用session播放音频,是在当前通话中,获得通话的session,然后通过session调用playback方法进行音频播放。
2、TTS引擎方法:
-- 先应答,防止电话断掉
session:answer();
while (session:ready() == true) do
-- 防止自动挂断
session:setAutoHangup(false);
-- 设置TTS引擎参数
session:set_tts_params("flite", "kal");
-- 播放欢迎语音
session:speak("Hello. Welcome to the VoIp World!");
-- 睡100ms
session:sleep(100);
-- 播放提示语音
session:speak("please select an Action.");
session:sleep(100);
-- 按1转到1001分机
session:speak("to call 1001, press 1");
session:sleep(100);
-- 按2挂断
session:speak("to hangup , press 2");
session:sleep(2000);
end
说明:使用此方法必前确保已经正确安装TTS。具体TTS安装和使用参考:FS+Lua+TTS实现IVR(互动式语音应答)-CSDN博客
方法三、使用IVR播放音频
freeswitch> originate user/1001 &ivr(welcome)