06月≪ 12345678910111213141516171819202122232425262728293031≫08月

スポンサーサイト

--/--/--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--:-- スポンサー広告

英単語はgoogle先生に読み上げさせて覚えよう!

2017/07/13
ふとしたきっかけで音声合成の技術がすごいことになっていることに気づきました。google翻訳が読み上げるテキストの英語が相当自然な感じ。では,日本語はどうよ?ということで日本語を読み上げさせてみたところ,英語よりは随分ナチュラルさが掛けるけれども,まぁ聞けなくはない。そこでふとよぎったのが,英語と日本語をコンピュータに読み上げさせれば,自分オリジナルのボキャビル用の音声マテリアルが作れるではないかっ!!

というわけで,早速ネット上を漁って,google翻訳等のText To Speechサービスに任意の文章を読み上げさせた音声データのファイルをダウンロードする方法を調べてみた。

まず,gooole翻訳に英語を読み上げさせる方法(本日現在)。こんな感じでアクセスするだけ。

http://translate.google.com/translate_tts?tl=en&q="ここに読み上げさせたい文章をURLエンコードしたもの"&client=tw-ob


単にwgetコマンドでファイルをダウンロードしようとしてもgoogle先生に弾かれるので,UAをChromeに偽装w 今のところ,これでDLできていますが,そのうちできなくなるのかな。情報によると,節度なくこれでアクセスしているとgoogle先生が起こって,IPで弾かれることもあるそうです。

wget --user-agent="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36" "http://translate.google.com/translate_tts?tl=en&q=$encoded&client=tw-ob" -O /tmp/headword.mp3



次,日本語。同じくgoogle先生に読み上げさせてもいいのですが,HOYAがやっているVoiceTextというサービスが個人での利用に限って,APIの使用を許してくれているので,日本語はそちらから落とすことにします。

まず,VoiceText Web APIの頁から無料会員登録をします。すぐに登録したメールアドレスにAPI KEYが送られてきますので,これを使ってアクセスします。

curl "https://api.voicetext.jp/v1/tts" -o "/tmp/japanese.wav" -u "送られてきたAPI_KEY" -d "text=ここに読み上げさせるテキスト" -d "speaker=show"


意外と簡単でした。

これで,CSVファイルに見出し語,例文,日本語をずらずら並べたものを読み上げさせて音声ファイルに落とすシェルスクリプトにしてみました。

#! /bin/bash

rawurlencode() {
local string="${1}"
local strlen=${#string}
local encoded=""

for (( pos=0 ; pos c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) printf -v o '%%%02x' "'$c"
esac
encoded+="${o}"
done
echo "${encoded}"
}

oldifs=$IFS
IFS=,

#行数のカウント
number=`wc -l $1.csv`
cln=1
cat $1.csv | while read hw example japanese; do

#head word
echo "Processing : $hw ($cln/$number)"
encoded=`rawurlencode "$hw"`
wget --user-agent="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36" "http://translate.google.com/translate_tts?tl=en&q=$encoded&client=tw-ob" -O /tmp/headword.mp3 -q

#example
encoded=`rawurlencode "$example"`
wget --user-agent="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36" "http://translate.google.com/translate_tts?tl=en&q=$encoded&client=tw-ob" -O /tmp/example.mp3 -q

#japanese
curl "https://api.voicetext.jp/v1/tts" -o "/tmp/japanese.wav" -u "6rpscyb36bl7o68r:" -d "text=$japanese" -d "speaker=takeru" -s -S

#convert
ffmpeg -i "/tmp/headword.mp3" -vn -ac 1 -ar 24000 -acodec pcm_s16le -f wav "/tmp/headword.wav" -loglevel error
rm /tmp/headword.mp3
ffmpeg -i "/tmp/example.mp3" -vn -ac 1 -ar 24000 -acodec pcm_s16le -f wav "/tmp/example.wav" -loglevel error
rm /tmp/example.mp3
ffmpeg -i "/tmp/japanese.wav" -vn -ac 1 -ar 24000 -acodec pcm_s16le -f wav "/tmp/japanese2.wav" -loglevel error
rm /tmp/japanese.wav
sox /tmp/headword.wav mute.wav /tmp/example.wav mute.wav /tmp/japanese2.wav mute.wav /tmp/temp.wav


#merge
if [ -e /tmp/temp2.wav ]; then
# 存在する場合
sox /tmp/temp2.wav /tmp/temp.wav /tmp/temp3.wav
rm /tmp/temp.wav /tmp/temp2.wav
mv /tmp/temp3.wav /tmp/temp2.wav
else
# 存在しない場合
mv /tmp/temp.wav /tmp/temp2.wav
fi
rm /tmp/headword.wav /tmp/example.wav /tmp/japanese2.wav

cln=`expr $cln + 1`
done

ffmpeg -i "/tmp/temp2.wav" -vn -ac 1 -ar 24000 -ab 128k -acodec libmp3lame -f mp3 "$1.mp3"
mv /tmp/temp2.wav $1.wav
IFS=$oldifs


URLエンコードする関数は,Create a speaking Linux shell script with Googleからパクりました。ありがとうございました。


スクリプト中のYOUR_API_KEYはご自分のAPIキーに置き換えてくださいね。
wgetコマンド,curlコマンド,soxコマンドが予め必要ですので,インストールしておいて下さい。
スクリプト本体がおかれているフォルダにポーズ用の無音のwavファイルをおいておく必要があります。私は0.7秒にしています。soxコマンドで結合するのに,サンプリングレートとチャンネル数を合わせる必要があるので,

$ sox -n -r 24000 -c 1 mute.wav trim 0.0 0.7


として,mute.wavという名前の無音のwavファイルを作って下さい。

使い方は,1行に,見出し語,例文,日本語の解説を書いたCSVファイルを用意して,スクリプトと同じフォルダに保存し,

./スクリプト名.sh CSVファイルの拡張子を除いたファイル名


で,勝手にmp3とwavファイルを作ってくれます。chmodお忘れなく。

あと,何故か分かりませんが,readコマンドが2行目から最初の3文字を正しく読み取ってくれないので,CSVは

yield,Higher-rate deposit accounts yield good returns.,産み出す
  yield,He reluctantly yielded to their demands.,圧力などに負けて,抵抗をやめる
↑半角スペース3つ


てな感じで,2行目以降は先頭の見出し語のまえに半角スペース3つを挿入しないといけません。詳しい方,なぜこうなるのか教えて下さい。

これ,便利です。さっそく通勤の車の中や,皿洗いをしながら聞いています。
スポンサーサイト
10:51 英語 | コメント(0) | トラックバック(0)
 | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。