このトピックでは、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も発音します。 理由は本当にわかりません。