このトピックでは、Google Translateのシンセサイザーを使用してIVRを実装するという興味深いトピックが求められました。
一般的に、私はこれをすることすら計画していませんでしたが、私にとっては面白くなりました。
そして、私が最初にしたことは、Googleがどのように話しているかを知ることでした。 うまく話しますが、100文字しかありません。 ただし、IVRを作成するにはこれで十分です。 最初の結果に満足し、この声をカットする方法を探し始めました。 短い検索でオプションを選択できました
 translate.google.com/translate_tts?q=&tl=ru
      
      私は彼とブラウザにぶつかり、音声テキストでmp3を受け取りました。 さらにインスピレーションを得て、この行をwgetに入れました。
  [utfadm@SIP:/var/lib/asterisk]> wget "http://translate.google.com/translate_tts?q=&tl=ru" 
      
        
        
        
      
     --2011-12-01 13:24:53-- translate.google.com/translate_tts?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82&tl=ru 
      
        
        
        
      
      translate.google.com (translate.google.com)... 173.194.32.225, 173.194.32.234, 173.194.32.235, ... 
      
        
        
        
      
       translate.google.com (translate.google.com)|173.194.32.225|:80...  . 
      
        
        
        
      
     HTTP- .  ... 403 Forbidden 
      
        
        
        
      
     2011-12-01 13:24:53  403: Forbidden. 
      
        
        
        
      
     
      
        
        
        
      
     --2011-12-01 13:24:53-- translate.google.com/translate_tts?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82&tl=ru 
      
        
        
        
      
         translate.google.com:80. 
      
        
        
        
      
     HTTP- .  ... 403 Forbidden 
      
        
        
        
      
     2011-12-01 13:24:53  403: Forbidden. 
      
        
        
        
      
    
      
      それから最初の不幸が私を待っていました。 しかし、少し考えた後、善良な人々の会社では愚かではないと考えられたので、彼らはwget mp3shechkiを与えません。 しかし、ブラウザは与えられます...
したがって、私たちは自分自身をブラウザとして偽装します。
 [utfadm@SIP:/tmp]> wget -U "Lynx 1.2.3.4" "http://translate.google.com/translate_tts?q=&tl=ru" 
      
        
        
        
      
     --2011-12-01 13:27:22-- translate.google.com/translate_tts?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82&tl=ru 
      
        
        
        
      
      translate.google.com (translate.google.com)... 74.125.232.1, 74.125.232.10, 74.125.232.11, ... 
      
        
        
        
      
       translate.google.com (translate.google.com)|74.125.232.1|:80...  . 
      
        
        
        
      
     HTTP- .  ... 200 OK 
      
        
        
        
      
     : 0 [audio/mpeg] 
      
        
        
        
      
       : ««translate_tts?q=\321%82\321%81\321%82&tl=ru»». 
      
        
        
        
      
     
      
        
        
        
      
     [ <=> ] 0 --.-K/s  0s 
      
        
        
        
      
     
      
        
        
        
      
     2011-12-01 13:27:22 (0,00 B/s) - «translate_tts?q=\321%82\321%81\321%82&tl=ru» saved [0/0] 
      
        
        
        
      
    
      
      うーん...ファイルの長さはゼロです。 もしそうなら
 [utfadm@SIP:/tmp]> wget -U "Lynx 1.2.3.4" "http://translate.google.com/translate_tts?q=text&tl=ru" 
      
        
        
        
      
     --2011-12-01 13:29:59-- translate.google.com/translate_tts?q=text&tl=ru 
      
        
        
        
      
      translate.google.com (translate.google.com)... 74.125.232.2, 74.125.232.11, 74.125.232.12, ... 
      
        
        
        
      
       translate.google.com (translate.google.com)|74.125.232.2|:80...  . 
      
        
        
        
      
     HTTP- .  ... 200 OK 
      
        
        
        
      
     : 4421 (4,3K) [audio/mpeg] 
      
        
        
        
      
       : ««translate_tts?q=text&tl=ru»». 
      
        
        
        
      
     
      
        
        
        
      
     100%[===================================================================================================================>] 4 421 --.-K/s  0s 
      
        
        
        
      
     
      
        
        
        
      
     2011-12-01 13:29:59 (95,5 MB/s) - «translate_tts?q=text&tl=ru» saved [4421/4421] 
      
        
        
        
      
    
      
      そしてそれは動作します...
考えて、考えて、考えて...
たぶん、オオヤマネコから来たロシア人のキャラクターはロシア人のために取られないのですか?
次に、ユーザーエージェントを、ロシア文字が正確に機能するものに変更します。
 [utfadm@SIP:/tmp]> /usr/local/bin/wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" "http://translate.google.com/translate_tts?q=&tl=ru" 
      
        
        
        
      
     --2011-12-01 13:32:27-- translate.google.com/translate_tts?q=%D1%82%D0%B5%D0%BA%D1%81%D1%82&tl=ru 
      
        
        
        
      
      translate.google.com (translate.google.com)... 173.194.32.225, 173.194.32.234, 173.194.32.235, ... 
      
        
        
        
      
       translate.google.com (translate.google.com)|173.194.32.225|:80...  . 
      
        
        
        
      
     HTTP- .  ... 200 OK 
      
        
        
        
      
     : 4421 (4,3K) [audio/mpeg] 
      
        
        
        
      
       : ««translate_tts?q=\321%82\321%81\321%82&tl=ru.1»». 
      
        
        
        
      
     
      
        
        
        
      
     100%[===================================================================================================================>] 4 421 --.-K/s  0s 
      
        
        
        
      
     
      
        
        
        
      
     2011-12-01 13:32:27 (103 MB/s) - «translate_tts?q=\321%82\321%81\321%82&tl=ru.1» saved [4421/4421] 
      
        
        
        
      
    
      
      ああ、それは良いです...ファイルの名前だけが何らかの形で不器用です
translate_tts?q=?%82?%81?%82&tl=ru.1
      
      その修正では、-Oキーが役立ち、名前は必要に応じて設定されます。
そのため、音声でファイルを受信する方法を学習したので、その方法を学習する必要があります*。
これを行うには、小さなスクリプトを書きます
#!/bin/sh 
      
        
        
        
      
     `ls /var/lib/asterisk/festivalcache/$2.gsm` 
      
        
        
        
      
     if [ $? -eq 1 ]; then 
      
        
        
        
      
     NAME=/var/lib/asterisk/festivalcache/$2 
      
        
        
        
      
     /usr/local/bin/wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" "http://translate.google.com/translate_tts?q=$1&tl=ru" -O $NAME.mp3 
      
        
        
        
      
     /usr/local/bin/mpg123 -w "$NAME.wav" "$NAME.mp3" 
      
        
        
        
      
     echo "Converting from wav to gsm" 
      
        
        
        
      
     /usr/local/bin/sox -t wav "$NAME.wav" -r 8000 -c1 -t gsm "$NAME.gsm" 
      
        
        
        
      
     rm $NAME.mp3 
      
        
        
        
      
     rm $NAME.wav 
      
        
        
        
      
     fi 
      
        
        
        
      
    
      
      それを見てみましょう。
最初の行では、すべてが明確です。
2番目のファイルはファイルをチェックし、既に存在している場合は、スクリプトはこの作業を終了します。
そうでない場合は、2番目の起動パラメーターからファイル名とそのフルパスを設定します。
Googleに最初の起動パラメーターからのテキストを含むリクエストを投げて、ファイルをmp3で保存します。
次に、wav、gsmの順にドライブします。
中間ファイルを削除します。
出力は、*を驚くほど再生できるgsm形式のファイルです。
まあ、実際には、ダイヤルプランに次のようなものを書きます。
exten => 227,1,Set(home=/var/lib/asterisk/festivalcache) 
      
        
        
        
      
     exten => 227,2,Wait(1) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/tts.sh ". " "${EXTEN}.${PRIORITY}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/${EXTEN}.$[${PRIORITY} - 1]) 
      
        
        
        
      
     exten => 227,n,Set(tic=${STRFTIME(${EPOCH},,%Y%m%d)})) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/dt.sh 1 "${EXTEN}.${tic}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/date/${EXTEN}.${tic}) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/tts.sh ".       " "${EXTEN}.${PRIORITY}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/${EXTEN}.$[${PRIORITY} - 1]) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/tts.sh ". ." "${EXTEN}.${PRIORITY}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/${EXTEN}.$[${PRIORITY} - 1]) 
      
        
        
        
      
     exten => 227,n,Set(tic=${STRFTIME(${EPOCH},,%H%M%S)}) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/dt.sh 2 "${tic}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/time/${tic}) 
      
        
        
        
      
     exten => 227,n,Hangup() 
      
        
        
        
      
    
      
      したがって、スクリプトを実行すると、ファイル227.3.gsm、227.8.gsm、227.10.gsmが生成されて再生されますが、その2つについては後ほど説明します。 リストされたファイルは一度生成されます。これは、ファイルが既に存在する場合、スクリプトが実行されないためです。 一度生成された50〜60のGoogleフレーズでさえ負担になることはないようですが、完全なメニューが提供されます。
後で説明すると約束した2つのファイルは、現在の日付と時刻です。 それらは文字列によって生成され、呼び出されます。
exten => 227,n,Set(tic=${STRFTIME(${EPOCH},,%Y%m%d)})) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/dt.sh 1 "${EXTEN}.${tic}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/date/${EXTEN}.${tic})
      
      そして
exten => 227,n,Set(tic=${STRFTIME(${EPOCH},,%H%M%S)}) 
      
        
        
        
      
     exten => 227,n,System(/bin/sh /var/lib/asterisk/dt.sh 2 "${tic}") 
      
        
        
        
      
     exten => 227,n,Playback(${home}/time/${tic})
      
      それぞれ。
呼び出しからわかるように、彼らは別のスクリプトに目を向けます。 これは、音声用にGoogleにアクセスするための既にレビューされたスクリプトのラッパーです。 次のようになります
#!/bin/sh 
      
        
        
        
      
     if [ $1 -eq 1 ]; then 
      
        
        
        
      
     q=`date +" %d.%m.%Y "` 
      
        
        
        
      
     n=date/$2 
      
        
        
        
      
     fi 
      
        
        
        
      
     if [ $1 -eq 2 ]; then 
      
        
        
        
      
     q=`date +"  %H:%M:%S"` 
      
        
        
        
      
     n=time/$2 
      
        
        
        
      
     fi 
      
        
        
        
      
     echo "$q" 
      
        
        
        
      
     /var/lib/asterisk/tts.sh "$q" $n 
      
        
        
        
      
    
      
      すべてがかなり明白です。 最初のパラメーターは、日付を取得するか時刻を取得するか、2番目のファイル名を決定します。 日付は、フォルダーの日付時刻にあります。 ファイル名から*がわかります。 tic = $ {STRFTIME($ {EPOCH} ,,%Y%m%d)})は1か月半であり、tic = $ {STRFTIME($ {EPOCH} ,,%H%M%S)}は1時間1秒です。 したがって、長時間にわたって時間フォルダを消去しないと、考えられるすべての組み合わせを蓄積できます。
このようなシンプルなラッパー。
任意の形式の短いフレーズを生成するには、最初のスクリプトのラッパーを作成するだけです。 シンプルで上品。
しかし、私はまだファイルを読むという考えを持っていましたが、結局のところ、ファイルは100文字以上を持つことができます。 そのため、いくつかのリクエストに分割する必要があります。 私が読む必要があるファイルの詳細は、多くの行を含むようなものですが、それらはすべて100文字未満です。 したがって、次のスクリプトをスキップしました。
[root@SIP:/var/lib/asterisk]# cat ttsb.sh 
      
        
        
        
      
     #!/bin/sh 
      
        
        
        
      
     Source=/var/lib/asterisk/source 
      
        
        
        
      
     i=0 
      
        
        
        
      
     splitted='' 
      
        
        
        
      
     NAME=/var/lib/asterisk/festivalcache/$2 
      
        
        
        
      
     `ls /var/lib/asterisk/festivalcache/$2.gsm` 
      
        
        
        
      
     if [ $? -eq 1 ]; then 
      
        
        
        
      
     for str in `cat $Source/$1` 
      
        
        
        
      
     do 
      
        
        
        
      
     i=`expr $i + 1` 
      
        
        
        
      
     WORKNAME=/var/lib/asterisk/festivalcache/$2.work.$i.mp3 
      
        
        
        
      
     splitted="$splitted $WORKNAME" 
      
        
        
        
      
     #echo $WORKNAME 
      
        
        
        
      
     #echo $str 
      
        
        
        
      
     #echo SP: $splitted 
      
        
        
        
      
     /usr/local/bin/wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" "http://translate.google.com/translate_tts?q=$str&tl=ru" -O $WORKNAME 
      
        
        
        
      
     done 
      
        
        
        
      
     /usr/local/bin/mpg123 -w "$NAME.wav" $splitted 
      
        
        
        
      
     echo "Converting from wav to gsm" 
      
        
        
        
      
     /usr/local/bin/sox -t wav "$NAME.wav" -r 8000 -c1 -t gsm "$NAME.gsm" 
      
        
        
        
      
     rm $splitted 
      
        
        
        
      
     rm $NAME.wav 
      
        
        
        
      
     fi 
      
        
        
        
      
    
      
      さて、ここでもすべてが明らかです。 ファイルを取得し、そのすべての行をGoogleでフィードし、すべてのmp3を1つのwavに接着し、gsmに変換して中間ファイルを削除します。 短い休止が聞こえるので、線が論理的に発音間の休止を意味する場合に適しています。
これで、一般的に、私はあなたが終えることができると思います:原則が設定され、必要なものを供給するラッパーを書くことができる基本的なスクリプトが設定されました、ラッパーの例とファイルの読み込みの例があります。
スフィンクスを確立し( ロシア語の文法のプロジェクトを 96%の精度で見た)、Googleの処理結果をフィードし、別の言語に翻訳し、Googleも発音します。 理由は本当にわかりません。