吴伟贤のBlog

Feed Rss

freeswitch cookbook 第五章(三) 使用短语宏创建声音提示

07.20.2013, freeswitch, by .

转自:http://www.8000hz.com/archives/76.html

 

Using phrase macros to build sound prompts 
使用短语宏创建声音提示

使用中我们经常而且很有必要拼接一些小的声音文件成一个大的声音文件. FreeSWITCH的短语宏系统就是一个非常强大工具, 不仅能拼接小的声音文件, 还可以添加一些逻辑处理,所以你的短语就不仅仅是一些独立文件的拼接.

Getting ready

本小方法中你至少需要一个文本编辑器和一个SIP电话.此外,还建议你看看你的语言短语文件. 英文的phrase文件就在源码目录docs/phrase/phrase_en.xml. phrase_en.xml文件前面是文件名, 后面就是它的文字描述. 提示音分成了不同的小章节如voicemail, IVR, currency, digits,和time. 目前最大的提示音列表就是IVR了.

在本方法中我们会建立一个可以播放主叫的分机号码的简单拨号方案,我们会使用phrase macro 来处理连接提示音的工作, 然后利用say 应用来读出主叫的分机号码.

How to do it…

开始添加extension到dialplan:
1. 创建或编辑文件conf/dialplan/default/01_Custom.xml
2. 添加以下行:

<extension name="who's calling">
  <condition field="destination_number" expression="^(1500)$">
    <action application="answer"/>
    <action application="playback"
            data="phrase:whoami:${username}"/>
    <action application="hangup"/>
  </condition>
</extension>

3. 保存文件退出

然后, 创建phrase macro:
1. 创建或编辑文件 conf/lang/en/ivr/custom.xml.
2. 添加以下行:

<macro name="whoami">
  <input pattern="^(\d+)$">
    <match>
      <action function="play-file"
              data="ivr/ivr-extension_number.wav"/>
      <action function="sleep" 
              data="100"/> 
      <action function="say" 
              data="$1" 
              method="pronounced" 
              type="number"/> 
    </match> 
    <nomatch> 
      <action function="play-file" 
              data="ivr/ivr-that_was_an_invalid_entry.wav"/> 
    </nomatch> 
  </input> 
</macro>

3. 保存文件退出
4. 在fs_cli控制台中执行reloadxml或按F6.

拨打1500测试新的extension.

How it works…
此操作的关键就是我们创建的dialplan extension中的这一行:

<action application="playback" data="phrase:whoami:${username}"/>

一般情况下playback应用都是传入一个文件名作参数. 不过, 如果参数以phrase:开头, 它就会查找短语宏而不是声音文件了. 在示例中, 我们调用了一个名叫whoami的宏, 同时给它传了一个参数${username}, 这个参数包含着中叫用户的ID号码.此时短语宏whoami就获得了控制.

传到macro中的参数在这一行得到了处理.

<input pattern="^(\d+)$">

输入的值会用来匹配pattern选项中的正则表达式. 大多数情况下${username}只包含数字,
我们把它匹配的值保存到了特殊的变量$1中. 此时,我们现在有一点点的逻辑,以帮助决定该怎么做。
如果输入的值匹配, 那么<match>对象中的actions被会执行. 如果输入的值不匹配, 那么<nomatch>对象中的action会被执行(极少数情况下非用户拨打了1500, 我们仅播放一个提醒, 您的输入不正确(That was an invalid entry)).

你可能已经想象出现在match或nomatch中的actions会被顺序执行.你也可以看到短语宏不仅仅局限于播放独立的声音文件. 你可以调用函数sleep和say来自定义向用户播放声音提醒的方式. 如果你装了一个TTS应用, 你也可以在宏中调用.

There’s more…

使用短语宏可以执行很多不同的操作.事实上, FreeSWITCH的语音邮件系统就大规模的使用了宏. 浏览conf/lang/en/vm/sounds.xml可以看到mod_voicemail模块用到的所有宏.
记住你可以使用sounds.xml文件中的任意一个宏只要你调用它们时传的参数正确.

有一个特别有用的短语宏叫voicemail_record_file_check. 想象一种情况,你需要主叫去录下一段声音. 也许你有一个自定义的应用,主叫需要录下一段声音. 这个宏允许你拥有一个自定义的phrase说一些这样的话”按1收听, 按2保存, 按3重新录制”. 举个例子,你可以使用play_and_get_digits去告诉用户怎么做:

<action application="play_and_get_digits" data="1 1 3 4000 # 
phrase:voicemail_record_file_check:1:2:3 ivr/ivr-invalid_entry.wav 
selection \d"/>

上面的action会准确地告诉主叫, “按1收听录音, 按2保存录音, 按3重新录制”. 它会把输入保存到变量${selection}中. 注意这个宏中提醒给主叫的声音是可以定制的.使用参数phrase:voicemail_record_file_check:4:5:6 调用宏时会告诉主叫”按4收听录音,按5保存录音,按6重新录制”.

学习phrase macros的一个好的学习方法就是呼叫语音邮件时观察控制台. 你可以实时地看到FreeSWITCH分析phrase macros和执行包含在内部的action.

See also
> 参考本章后面提到的  mod_flite模块和基础TTS 和 mod_tts_commanline模块和高级TTS

评论已关闭。