在 FreeSWITCH 中使用 google translate 进行文本语音转换

358 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

前段时间有一个语音识别的项目,便轻轻地研究了一下,虽没有达到预期的效果,但过程还是比较有趣。

题目是这样的:给定一些潜在客户,用 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)

作为测试,我选择了以下几种:

  1. 您拨的号码是空号,请查证再拨….(无限循环)
  2. 对不起,您拨叫的用户不方便接听您的电话,请稍后再拨。Sorry, the subscriber you have dialed is not convenient to answer now, please dial again later. (循环…)
  3. 您好,您所拨打的号码是空号,请核对后再拨。您好,您所拨打的号码是空号,请核对后再拨。Sorry, the number YOU dialed doesn’t exist, please check it and dial again.(循环… 一个问题是 YOU 有必要强调吗?)
  4. 号码是空号,请查证后再拨。 Sorry, The number you have dialed is not in service, please check the number and dial again. (循环)

如果你听一下,你会发现真是太难听了。那么大的电话公司,不能找个专业的人录音吗?(个人感觉 test4.wav 还是比较专业)

test1.wav test2.wav test3.wav test4.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>