四:在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

CentOS 5下freeswitch中集成使用ekho实现TTS功能三的更多相关文章

  1. CentOS 5下freeswitch中集成使用ekho实现TTS功能二

    三:以上Festival安装完成以后回到ekho安装目录: 执行./configure --enable-festival 前 更改configure 1:替换 #AC_DEFINE(ENABLE_F ...

  2. freeswitch中集成使用ekho实现TTS功能一

    Linux下安装freeswitch并集成ekho实现TTS 1. linux下安装freeswitch就不多介绍了,具体链接网址: http://www.8000hz.com/archives/14 ...

  3. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能

    在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...

  4. 实战MySQL集群,试用CentOS 6下的MariaDB-Galera集成版

    说起mysql的集群估计很多人会首先想起mysql自带的replication或者mysql-mmm.mysql-mmm其实也是基于mysql自带的replication的,不过封装的更好用一些,但是 ...

  5. 现有项目中集成Flutter

    本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的 ...

  6. 怎么在我们的App中集成条码扫描功能?

    现在很多App都有条码扫描功能,有的手机比如某米在照相机中集成了条码扫描功能,但是还有一部分手机没有这样的集成,比如韩国某星,需要自己下载一个条码扫描App.今天我们就来看看怎么在自己的App中集成一 ...

  7. windows下VMware-workstation中安装CentOS

    windows下VMware-workstation中安装CentOS,可以分两部分,安装虚拟机和安装CentOS虚拟机.具体步骤如下: 一.安装虚拟机 1.安装VMware-workstation, ...

  8. (转)windows下VMware-workstation中安装CentOS

    windows下VMware-workstation中安装CentOS   windows下VMware-workstation中安装CentOS,可以分两部分,安装虚拟机和安装CentOS虚拟机.具 ...

  9. Windows系统下在Eclipse中集成Python

    我现在偶尔开发代码,已经不用Eclipse了,主要原因是查看Jar包中的代码反编译十分不便,项目加载的时候卡,偶尔还会崩溃 用Intellij IDEA和PyCharm 原来的笔记如何在Eclipse ...

随机推荐

  1. 22lvs 健康节点检查

    [root@lb03 scripts]# cat lvm_health_check.sh #!/bin/bash web_ip=( 10.0.0.17 10.0.0.18 ) # 检查恢复就添加节点 ...

  2. OpenFiler configuration

    5.OpenFiler configuration   登录Openfiler   步骤1:安装 FireFox   步骤2:通过FireFox以HTTPS://server-ip:446 远程访问O ...

  3. VLC Web插件的浏览器兼容性

    网页插件实现原理 IE浏览器基于Activex插件来实现,非IE浏览器采用NPAPI来实现,所以,非浏览器需要支持NPAPI来实现. IE浏览器 FF浏览器(版本小于52) 原因从 Firefox 版 ...

  4. php或js判断网站访问者来自手机或者pc端源码

    很多时候也可以通过逻辑程序来进行判断,如PHP.JS是常用的两种识别访问设备类型的常用方法. 原理都是采用识别访问客户端的HTTP_USER_AGENT,然后进行关键字匹配进行确定设备类型,对于伪造H ...

  5. android自定义View_3——Optimizing the View

    前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...

  6. CFindReplaceDialog学习

    The CFindReplaceDialog class allows you to implement standard string Find/Replace dialog boxes in yo ...

  7. Gson和Fastjson的使用

    转载自:JSON技术的调研报告 一.Google的Gson包的使用简单介绍. Gson类:解析json的最基础的工具类 JsonParser类:解析器来解析JSON到JsonElements的解析树 ...

  8. 怎样在Mac OS X上面指定Eclipse启动时用指定的某一版本号JDK?

    编辑 $ECLIPSE_HOME/Eclipse.app/Contents/MacOS/eclipse.ini 文件.在 Finder 中右键或者Ctrl+点击 Eclipse 应用程序.然后点击&q ...

  9. Oracle Delete与系统资源

    在用Delete删除数据时,SQL语句首先要通过全表扫描或索引扫描找到符合条件的记录并删除. 然而在这个过程中将消耗大量的CPU资源,I/O资源以及UNDO数据. 如果删除的数据量较大,将极大的影响系 ...

  10. 创建新的C++工程来调用Caffe对图片进行识别

    前段时间一直在跑Caffe训练数据.之前用训练好的caffemodel对图片进行分类都是用的命令行指令,于是就想着自己新建一个工程来调用caffe,结合classification的代码来对图片进行分 ...