我花了三个星期的时间试图让它发挥作用。我想使用github上提供的googletts.agi脚本从星号进行语音拨号。它是有效的,但问题是谷歌有时会在"话语"变量中返回一个单词而不是数字,比如18004633339,可能会返回为"180046 tree tree nite"或"1800 force 6 tree 339"等。
https://github.com/zaf/asterisk-googlettshttps://github.com/zaf/asterisk-speech-recog
下面的链接有一个将单词转换为数字的脚本
http://www.karlrixon.co.uk/writing/convert-numbers-to-words-with-php
这是我的拨号计划
exten => 2255,1,Answer()
exten => 2255,n,Wait(1)
;exten => 2255,n,flite("Say the number you wish to call. Then press the pound key.")
exten => 2255,n,Espeak("Say the number you wish to call. Then press the pound key.")
exten => 2255,n(record),agi(speech-recog.agi,en-US)
exten => 2255,n,Noop(= Script returned: ${status} , ${id} , ${confidence}, ${utterance} =)
exten => 2256,6,Set(NUM2CALL=${utterance})
此处需要代码,该代码将使用${话语}或NUM2CALL变量,并在其中有单词的情况下将其修复为星号可以拨打的正确数字
exten => 2255,n,SayDigits("${NUM2CALL2}")
exten => 2255,n,Background(vm-star-cancel)
exten => 2255,n,Background(vm-tocallnum)
exten => 2255,n,Read(PROCEED,beep,1)
exten => 2255,n,GotoIf($["foo${PROCEED}" = "foo1"]?15:16)
exten => 2255,15,Goto(outbound-allroutes,${NUM2CALL2},1)
exten => 2255,16,hangup
我在想,如果我能添加到字典数组中,我最终会有一个非常准确的语音拨号器。我花了4天时间测试tropoASR,它对个位数非常准确,但对多位数的精度下降得很快。提前感谢您的帮助。我将把完成的脚本作为一个项目发布在github上。我尝试了pocketphinx,也尝试了TIDIGITS语法和模型,但这比pocketphimx默认字典更糟糕,后者也出现了类似的问题。
使用AGI,PHP-AGI,您可以调用一个函数,即convert_word_to_number
并设置一个变量,您可以在执行AGI脚本后在拨号盘中使用。
在拨号计划中
exten => 2256,6,Set(NUM2CALL=${utterance})
exten => 2256,n,AGI(/home/asterisk/agi-bin/words_agi.php);
AGI脚本:
#!/usr/bin/php -q
<?php
set_time_limit(30);
require_once 'phpagi.php';
// replace this function with yours
function convert_word_to_number($word) {
$words = array(
'tree',
'too',
// ...
);
$numbers = array(3,2)
// replace words with numbers - example only
$num = str_replace($words, $numbers, $word);
return $num;
}
$agi = new AGI();
$word = $agi->get_variable("NUM2CALL");
$spokenNumber = convert_word_to_number($word);
$agi->set_variable("NUM2CALL", $spokenNumber);
你只需要实现一个更准确的convert_word_to_number
版本,用数字代替单词,用你的函数代替它。