CentOS 5下freeswitch中集成使用ekho实现TTS功能三

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

时间: 2024-10-29 05:50:57

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

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

三:以上Festival安装完成以后回到ekho安装目录: 执行./configure --enable-festival 前 更改configure 1:替换 #AC_DEFINE(ENABLE_FESTIVAL,,[Enable Festival]) #LIB_FESTIVAL="${srcdir}/lib/libFestival.a ${srcdir}/lib/libestools.a ${srcdir}/lib/libestbase.a ${srcdir}/lib/libeststrin

现有项目中集成Flutter

本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的,这其中的坑,只有写过的人才能体会到. 1. 纯Flutter项目的问题 在论述纯Flutter项目问题之前,我先表述下我的观点(仅限于纯Flutter项目,目前时间2018年6月26日,不排除Flutter的发展,让我的观点改观): 对于个人开发者,可以使用纯Flutter去开发App尝鲜: 对于

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

现在很多App都有条码扫描功能,有的手机比如某米在照相机中集成了条码扫描功能,但是还有一部分手机没有这样的集成,比如韩国某星,需要自己下载一个条码扫描App.今天我们就来看看怎么在自己的App中集成一个条码扫描的功能. 本文源码下载地址http://download.csdn.net/detail/u012702547/9101419 先来看张效果图: 自己开发一个条码扫描显然是非常不现实的,我们可以使用GitHub上的开源控件ZXing来实现这样一个功能. 使用ZXing当然要先下载:http

ueditor1.4.3在.net环境下的vs开发工具中集成经验

Ueditor是个很不错的在线富文本编辑器,几个项目一直使用它.最近想更新版本,发现新版1.4.3与旧版的部署方式完全不一样了,官网文档介绍的是直接放在iis下的部署说明,没有提到在vs开发工具中如何集成,自己新建了一个测试项目琢磨了一会,测试没啥问题,记录下给大家分享. 项目结构如下图: 因为我创建的是web项目类型,所以把controller.ashx以项目形式的一般处理程序迁移过去,并重命名成ueditor.ashx(记得在ueditor.config.js修改服务器统一请求接口路径).另

CentOS环境下,gdb调试中出现:Missing separate debuginfos, use: debuginfo-install.....的问题

在gdb调试时segmentation fault问题时,遇到下面的了问题: Program received signal SIGABRT, Aborted.0x00007ffff73eb925 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:6464 return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);Missing separate debuginfos, use:

CentOS 6.5系统中RPM安装配置MySQL数据库

一.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内, 这样就增加了速度并提高了灵活性.MySQL的SQL语言是用于访问数据库的最常用标准化语言.MySQL软件采用了双授权政策(本词条"授权政策"), 它分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

centos 7 下多网卡绑定

一.前言 CentOS7之前系统提供给用户的是bonding driver来实现链路聚合,实际上bonding适用于大多数应用.Bonding driver的架构是由内核空间完全控制.管理. Team driver又是什么呢?它是被设计用一整套不同的设计和不同的方法来实现bonding能做到的事,它的这种更灵活.更高效. 具体数据:http://rhelblog.redhat.com/2014/06/23/team-driver/ 针对现有的bonding配置,如果想从bonding drive

细说shiro之五:在spring框架中集成shiro

官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${version.shiro}</version> </dependency&g