四:在freeswitch中调用ekho
注:在测试过程中该语音包好像没用
FreeSWITCH 中文语音包测试版fssounds.zip
在/usr/local/freeswitch/sounds/下建立目录zh/cn/sue(因为不知道声音主人的名字,就先用sue代替了,抱歉抱歉)
mkdir -p /usr/local/freeswitch/sounds/zh/cn/sue
将声音文件移动到目标目录
mv output/* /usr/local/freeswitch/sounds/zh/cn/sue/
- 增加中文定义
cd /usr/local/freeswitch/conf/lang
cp -a en zh
cd zh
mv en.xml zh.xml
编辑zh.xml,将第2行换成
<language name="zh" say-module="zh" sound-prefix="$${sounds_dir}/zh/cn/sue" tts-engine="mod_tts_commandline" tts-voice="sue">
- 增加对中文的加载
编辑/usr/local/freeswitch/conf/freeswitch.xml,找到<section name="languages" description="Language Management">段,加入
<X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
- 增加中文say模块的加载
编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
去除<load module="mod_say_zh"/>的注释
- 设置中文为默认语言
编辑/usr/local/freeswitch/conf/vars.xml,加入以下几行
<X-PRE-PROCESS cmd="set" data="default_language=zh"/>
<X-PRE-PROCESS cmd="set" data="default_dialect=cn"/>
<X-PRE-PROCESS cmd="set" data="default_voice=sue"/>
- 增加对ekho的中文支持
编辑/usr/local/freeswitch/conf/autoload_configs/tts_commandline.conf.xml
将<param name="command" value="echo ${text} | text2wave -f ${rate} > ${file}"/>
改为:
<param name="command" value="echo ${text} > tmp.txt; iconv -t UTF8 tmp.txt >${file}.txt; ekho -v ${voice} -f ${file}.txt -o ${file}"/>
或者是。其中iconv -t UTF8 tmp.txt >${file}.txt;这句是因为有些系统要转换字符编码
<param name="command" value="echo ${text} > ${file}.txt; ekho -f ${file}.txt -o ${file}"/>
- 重新加载xml,在fs_cli,执行:
reloadxml
- 外呼电话路由到lua脚本实现TTS
originate user/1002 &lua(recharge.lua)
1 --session:set_tts_parms("tts_commandline", "Ting-Ting") 2 --session:setVariable("tts_engine", "tts_commandline") 3 --session:setVariable("tts_voice", "Ting-Ting") 4 --session:answer() 5 --session:sleep(1000) 6 --print("hello") 7 --session:speak("hello") 8 --session:speak("您好,欢迎使用空中充值服务") 9 --session:speak("hello,我是好人") 10 --session:sleep(5000) 11 12 13 error_prompt = "say:输入错误,请重新输入" 14 account = "" 15 digits = "" 16 balance = 100 --余额 17 charge = 100 --充值卡上金额 18 19 function error() 20 session:speak("输入错误,请重新输入") 21 end 22 23 function do_charge(account, charge) 24 balance = balance + charge 25 return balance 26 end 27 28 function main_menu() 29 if not session:ready() then return end 30 31 --session:speak('查询请按1,充值请按2,否则请挂机') 32 digits = session:playAndGetDigits(1, 1, 3, 10000, "#", "say:查询请按1,充值请按2,否则请挂机", error_prompt, "^1|2$") 33 --digits = session:playAndGetDigits(2, 2, 3, 10000, "#", "", "", "") 34 --session:speak('输入错误,请重新输入') 35 --digits = session:playAndGetDigits(1, 1, 3, 5000, "#", "", "", "^1|2$") 36 session:execute("log", "INFO main_menu:" .. digits) 37 if not (digits == "") then 38 ask_account(digits) 39 else 40 --session:speak('输入错误,请重新输入') 41 --main_menu() 42 goodbye() 43 end 44 end 45 46 function ask_account(service_type) 47 if not session:ready() then return end 48 49 digits = session:playAndGetDigits(4, 5, 3, 5000, "#", "say:请输入你的帐号,以井号结束", error_prompt, "^\\d{4}$") 50 session:execute("log", "INFO account:" .. digits) 51 if not (digits == "") then 52 account = digits 53 if (service_type == "1") then 54 ask_account_password() 55 else 56 ask_card() 57 end 58 else 59 goodbye() 60 end 61 end 62 63 function ask_account_password() 64 if not session:ready() then return end 65 66 digits = session:playAndGetDigits(4, 5, 3, 5000, "#", "say:请输入你的密码,以井号结束", error_prompt, "^\\d{4}$") 67 session:execute("log", "INFO account p:" .. digits) 68 if not (digits == "") then 69 password = digits 70 chack_account_password() 71 else 72 goodbye() 73 end 74 end 75 76 77 78 function ask_card() 79 if not session:ready() then return end 80 81 digits = session:playAndGetDigits(4, 5, 3, 5000, "#", "say:请输入你的充值卡卡号,以井号结束", error_prompt, "^\\d{4}$") 82 session:execute("log", "INFO card:" .. digits) 83 84 if not (digits == "") then 85 card = digits 86 chack_account_card() 87 else 88 goodbye() 89 end 90 end 91 92 93 function chack_account_password() 94 if not session:ready() then return end 95 96 if (account == "1111" and password == "1111") then 97 session:speak("您的余额是" .. balance .. "元") 98 session:sleep(5000) 99 main_menu() 100 else 101 session:speak("输入错误,请重新输入") 102 main_menu() 103 end 104 end 105 106 function chack_account_card() 107 if not session:ready() then return end 108 109 if (account == "1111" and card == "2222") then 110 session:speak("您要充值" .. charge .. "元") 111 112 digits = session:playAndGetDigits(1, 1, 3, 10000, "#", "say:确认请按1,返回请按2", error_prompt, "^[12]$") 113 114 if digits == "1" then 115 balance = do_charge(account, charge) 116 session:speak("充值成功,充值金额为" .. charge .. "元,余额为" .. balance .. "元") 117 main_menu() 118 else 119 if digits == "2" then 120 session:sleep(5000) 121 main_menu() 122 else 123 goodbye() 124 end 125 end 126 else 127 session:speak("输入有误,请重新输入") 128 ask_account("2") 129 end 130 end 131 132 function goodbye() 133 if not session:ready() then return end 134 135 session:speak("再见") 136 session:hangup() 137 end 138 139 140 session:set_tts_parms("tts_commandline", "Mandarin") 141 session:setVariable("tts_engine", "tts_commandline") 142 session:setVariable("tts_voice", "Mandarin") 143 144 session:answer() 145 --session:speak("hello,welcome to freeSWITCH") 146 session:speak("您好,欢迎使用空中充值服务") --,"zh", "messages", "pronounced") 147 session:set_tts_parms("flite", "kal") 148 session:speak("Please say the name of the person you're trying to contact") 149 session:set_tts_parms("tts_commandline", "Mandarin") 150 --session:speak("您好,欢迎使用空中充值服务") 151 --session:say("12345", "zh", "number", "pronounced") 152 --session:sleep(10000) 153 main_menu() 154 --session:streamFile("/usr/local/freeswitch/hello.wav") 155 --session:streamFile("/usr/local/freeswitch/sounds/zh/cn/sue/ivr/8000/ivr-accept_reject_voicemail.wav") 156 --Sound.load("/usr/local/freeswitch/sounds/music/8000/danza-espanola-op-37-h-142-xii-arabesca.wav"):play() 157 session:hangup() 158 --session:print("hello!")
特别注意:
首先要在freeswitch中编译安装mod_say_zh和mod_tts_commandline 模块;如freeswitch已经安装但是未安装该2个模块,则按以下步骤安装:
1. 在freeswitch源代码目录中使用
make mod_say_zh-install
make mod_tts_commandline
2.然后到freeswitch中加载该模块
load mod_say_zh
load mod_tts_commandle