zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JAVA基础知识之多线程——线程通信
    为Apache配置虚拟机Virtual Host
    SignalR的坑爹细节
    ashx入侵
    aspnet5安装ef7备忘
    aspnet5备忘
    NHibernate初步使用
    MVC中发生System.Data.Entity.Validation.DbEntityValidationException验证异常的解决方法
    关于NLog的target和Layout
    泛型约束的大概模样
  • 原文地址:https://www.cnblogs.com/zxqdlenovo/p/4031060.html
Copyright © 2011-2022 走看看