前段时间有一个语音识别的项目,便轻轻地研究了一下,虽没有达到预期的效果,但过程还是比较有趣。
题目是这样的:给定一些潜在客户,用 FreeSWITCH 自动呼叫,如果用户应答,则转至 IVR,播放欢迎信息甚至转至人工座席;如果客户不应答,则获取不应答原因。
该想法想要达到的目标是:1)客户关怀。客户注册即可收到关怀电话(当然前提是留下电话号码。OK,发短信是另一种方式,但我这们里讨论的是语音);2)过滤无效客户。从不同渠道来的客户数据良莠不齐,有的甚至50%以上都无法打通,所以,把这部分数据过滤掉显然是很有意义的。
虽然我们在外呼中使用 SIP,但被叫用户在PSTN,而PSTN信令网一个很令人讨厌的地方就是返回的信令不准确,所以,你无法从信令层面获取被叫用户的状态(空号,忙等),而只能从语音层面去“听”。当然,听,对于人来说是没有问题的,但对于机器来说,就不轻松了,它需要使用语音识别(ASR,Automatic Sound Recognition)技术来实现。
Sphinx 应该是开源的语音识别公认的比较好的软件。幸运的是 FreeSWITCH 带了 pocket_sphinx 模块。它即能进行连续的识别,也能针对关键词进行识别,在测试阶段,成功率还是比较高的。但实际上我们真正要测的数据太烂,所以没有收到好的效果。
样本
目前PSTN网上有各种语音数据,除了各种各样的彩铃之外,便是五花八门的语音提示,而且,针对同一种挂机原因,有各种不同版本的语音提示。为了获取样本,我打了不同省市不同运营商的电话并录音:
originate sofia/gateway/blah/139xxxxxxxx &record(/tmp/testx.wav) 复制代码
作为测试,我选择了以下几种:
- 您拨的号码是空号,请查证再拨….(无限循环)
- 对不起,您拨叫的用户不方便接听您的电话,请稍后再拨。Sorry, the subscriber you have dialed is not convenient to answer now, please dial again later. (循环…)
- 您好,您所拨打的号码是空号,请核对后再拨。您好,您所拨打的号码是空号,请核对后再拨。Sorry, the number YOU dialed doesn’t exist, please check it and dial again.(循环… 一个问题是 YOU 有必要强调吗?)
- 号码是空号,请查证后再拨。 Sorry, The number you have dialed is not in service, please check the number and dial again. (循环)
如果你听一下,你会发现真是太难听了。那么大的电话公司,不能找个专业的人录音吗?(个人感觉 test4.wav 还是比较专业)
test1.wavtest2.wavtest3.wavtest4.wav
第一种方案,关键词
我将几个关键字写进了 grammer中,如:
``
grammar hpcause;
= [ service ]; = [ convenient ]; = [ busy ]; = [ konghao ]; = [ exist ]; public = [ | | | | ]; 实际测试中,我甚至将“空号”(konghao)作为关键词加上去,的确有时候能识别出来。由于中英文混杂,识别率太低。纯英文的环境比较理想。 ## 第二种方案,连续识别 当然我也试过连续的语音识别,效果都不理想。pocket_sphinx 是支持中文的,但配置比较复杂,而且我也怀疑它在中英文混合识别方面的效果到底如何。 ## 第三种方案,只录音,采用外部程序识别 要想在 FreeSWITCH 中准确识别这么复杂的情况看来是不现实的。另一种想法就是只录音,而采用外部程序(可能还是 Sphinx)来识别。可以针对中英文各识别一次,去掉不能识别的部分,我相信效果还是可以的。但没有试过。 ## 第四种方案,Google Voice 实际上 Google Voice 有一个很有趣的功能就是 Voice Mail,当你的电话无法接通时,它可以录音,并能转换成文本。我今天忽然想到,能否让 Google Voice 来替我们做这项工作 ?如果行,对于每个 Voice Mail 我们都能收到一封电子邮件,岂不是绝了? 我赶紧试了以下命令: originate {ignore_early_media=true}sofia/gateway/blah/1717673xxxx
'sleep:3,playback:/home/app/t/test4.wav' inline 上面,我呼叫我的 Google Voice 号码,并拨放声音文件,为了等待 Google Voice 启动 Voice Mail,暂停了3秒。其中使用了 FreeSWITCH 的 inline dialplan。 不得不说,人家 Google Voice 的功力就是比较深,以下是呼叫结果(虽然它花了好长时间生成这些文本):
今天,偶然发现 google translate 一个很酷的功能,TTS。
在浏览器中输入 translate.google.com/translate_t… 然后立即就可以播放声音。
又试了一下这个,呵呵 translate.google.com/translate_t… ,也好用。
我在Mac上分别用 Safari, Chrome 和 FireFox 都测试通过。
那么,能不能在 FreeSWITCH 里用呢?当然,FreeSWITCH 通过 mod_shout 支持 mp3!
默认的 FreeSWITCH 中 mod_shout 是不编译的,所以需要自己编译。到源代码目录下,执行
make mod_shout-install 复制代码
就装好了(当然,前提是你已经用源代码安装了 FreeSWTICH 的情况,参见 电子书第二章)。
在 FreeSWITCH 命令行上装入模块:
load mod_shout 复制代码
测试一下:
originate user/1000 &playback(shout://translate.google.com/translate_tts?q=hello+and+welcome+to+www+dot+dujinfang+dot+com&tl=en) 复制代码
太爽了。但中文的没有成功,不知道为什么。
当然你也可以写到 Dialplan 中,然后呼叫 1234 试一下 :D(为了排版方便,我换行了,记着shout 那一行别断行)
<extension name="Free_Google_Text_To_Speech"> <condition field="destination_number" expression="^1234$"> <action application="answer" data=""/> <action application="playback" data="shout://translate.google.com/translate_tts? q=hello+and+welcome+to+www+dot+dujinfang+dot+com&tl=en"/> </condition> </extension>