Google翻訳+アスタリスクIVR

私は長い間、どのブログを投稿するかを考え、ここが彼に最適な場所だと判断しました。 トピックの主なアイデアが「sh-何でもできる」という理由だけの場合。



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



All Articles