FC2ブログ
09月≪ 12345678910111213141516171819202122232425262728293031≫11月

スポンサーサイト

--/--/--
上記の広告は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)

桐原書店FOREST えいご@DS

2010/03/09
わたくし,英語上達完全マップの信奉者です。マップでは,英文法に関して,グラマーの問題集をこなして,問題に瞬間的に反応できるようになりなされ,というようなことを仰っているのだと勝手に理解しています。

それで一度,有名な桐原書店のフォレストとその問題集を買い込んできて,さっそく取り組んでみましたが,やはり,毎日定期的に机に向かって問題集を解くなんて,そんな芸当,学校を卒業して15年以上もたった今,できっこありません。

それが去年の今頃のことだったような気がします。

そのとき目に止まったのが,フォレストがニンテンドーDSのソフトになる!という記事。ただ,その時は未だ未発売で,発売時期だけがアナウンスされていました。それで発売を待っていたのですが,なかなかリリースされず,そうこうしているうちに,英文法のことなんてすっかり忘れてしまっていました。

先日,嫁さんがメシを作ってくれている間に退屈しのぎにDSでスーパーマリオでもやるかと超久々にDSを取り出した瞬間,おもむろに「桐原書店FOREST えいご@DS」のことを思い出し,速攻Amazonで注文。最近はアマゾンの配送も早いですね。2日で到着。

それからはまってます。とにかくガンガン問題解きまくって,間違えた問題はその場で解説を読む。間違っては解説を読むを繰り返していたら,難解で理解不能,そんな言い回し知らなくったって,なんとかなると思って諦めていた仮定法過去完了もおぼろげながら理解し始めたような気がします。

いいなと思うのが,問題を説いているうちに,細かいことまでいろいろ覚えられそうなこと。

文法の嫌なところってのが,大原則の説明の後に,たっくさんの「例外」「細則」みたいのがうじゃうじゃあって,「こんなのおぼえられるかー!!」ってくらいたくさん文法項目がありますが,これが,問題を解いては不正解,解説のサイクルを何度か繰り返しているうちに,自然と覚えちゃうんだな。しかも,コンピュータソフトだから,繰り返しがらくちん。いちいち,間違えた問題に印をつけて,最後までやったら,また間違えた問題だけ最初からやり直し,見たいな地道な努力が必要じゃない。とりあえず,電源入れて,タッチペンでタップしてれば,バンバン問題が出題されるってのが手軽でいい。

とりあえず,一番基本の基本練習みたいなのをここ数日やりまくっていたら,レベル10で全部正答してしまいました。とりあえず,レベル0~9も100%正答することが現在の目標。全部で6000問収録されているらしいので,これら全部を瞬殺できるようになったら,かなりのもんでは?とほくそ笑んでいます。

そのあと,データを消去してゼロからもう一度繰り返せば,穴も潰せるかなと。

いやぁー,ヒットです。

13:24 英語 | コメント(0) | トラックバック(0)
 | HOME | 

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