AWS の AI サービスを使ってオリジナルのオーディオ型英単語帳を作る

2020-04-30
日常で楽しむクラウドテクノロジー

Author : 日山 雅之

こんにちは。プロトタイピングソリューションアーキテクトの日山です。

IT 業界で働いていると英語のリファレンスを読んだり、海外のカンファレンスのセッションを聞いたりで、英語を使用する機会が多いのではないでしょうか ? より円滑に、英語でのドキュメントやビデオを通じて情報収集するために、日々英語を勉強している方も多いのではと思います。

私も日々英会話スクールや Amazon Prime を使用してスピーキングやリスニングのスキル鍛えていますが、苦戦しているのがボキャブラリースキル (いかに多くの英単語を知っているか) です。覚えるために、学習中に出会った知らない英単語とその日本語訳と共にノートにメモしているのですが、それっきりですぐに忘れてしまいます。再学習していないからです。記憶の忘却曲線的には、適切なタイミングで再学習すると効果的みたいです。

どうすれば効率的に再学習できるか ? 昔ながらの単語帳を作るのも良いですが、持ち歩く手間を考えるとスマートフォンで実現したいですし、かつ単語帳をオーディオとして聞くことができれば、歩きながら聞くことができるので、より学習時間を捻出できそうです。

そこで、今回は AWS の AI サービスを使用して、再学習したい英単語 (とその日本語訳) を延々聞くことができるオーディオ型の英単語帳を作成してみたいと思います。

実装すること

今回は、Amazon Translate と Amazon Polly を使用して再学習したい英単語とその日本語訳を読み上げるオーディオファイルを作成します。まず Amazon Translate を使用して英単語の日本語訳を取得します。その後、Amazon Polly を使用して、英単語とその日本語訳のオーディオファイルを作成します。最後に FFmpeg を使用して、各英単語と日本語訳のオーディオファイルを1つのファイルに統合します。

今回、解説に使用するプログラミング言語 Python 3.8.0 で、OS は Windows 10 を使用します。

Amazon Polly とは

テキストを音声に変換することができるサービスです。詳しくは Amazon Polly 紹介ページおよびビデオをご参照ください。

Amazon Translate とは

テキストを多言語に翻訳することができるサービスです。詳しくは Amazon Translate 紹介ページをご参照ください。 

【AWS Black Belt Online Seminar】AWS AI Services

実装してみる

AWS CLI をインストールして設定を行う

もし AWS CLI をインストールしていないのであれば、こちらのページに従いインストールしましょう。

またインストール後は "aws configure" コマンドで、AWS アクセスに使用する IAM ユーザの AWS Access Key ID と AWS Secret Access Key を入力します。 今回使用する IAM ユーザーには以下の権限が必要になります。

  • polly:SynthesizeSpeech
  • translate:TranslateText
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "polly:SynthesizeSpeech",
                "translate:TranslateText"
            ],
            "Resource": "*"
        }
    ]
}

Amazon Translate で英単語を日本語に翻訳する

まず、再学習対象の英単語の日本語訳を Amazon Translate を使用して取得する処理を実装します。
AWS SDK for Python である Boto3 をインストールします。Boto3 は Amazon Translate と Amazon Polly へのアクセスで使用します。
pip install boto3
適当な作業フォルダに以下の通りの Python ファイルを作成します。
import boto3

region = 'ap-northeast-1'
translate = boto3.Session(region_name=region).client('translate')

def main():
    words = ['dog', 'cat', 'hamster']  # 再学習したい英単語リスト
    for word in words:
        jpword = translate_en_to_ja(word)
        print(jpword)

def translate_en_to_ja(word):
    resp = translate.translate_text(
        Text=word,
        SourceLanguageCode="en",
        TargetLanguageCode="ja")
    return resp.get('TranslatedText')

main()
変数 " region" には使用する AWS リージョンを指定します。今回は " ap-northeast-1 (東京)" を指定しています。
変数 " words" に、再学習したい英単語リストを指定します。
 
この Python コードを実行すると、各英単語の Amazon Translate を使用して取得した日本語訳が画面に表示されます。

Amazon Polly で英単語と日本語訳を音声化して保存する

次に、Amazon Polly を使用して、英単語とその日本語訳をオーディオファイルとして保存する処理を実装します。
 
まず、main 関数と main 関数を呼び出す行の間に、以下の convert_to_audio 関数を追加します。
polly = boto3.Session(region_name=region).client('polly')
def convert_to_audio(word, voiceId, output_file_name):
    resp = polly.synthesize_speech(
        VoiceId=voiceId,
        OutputFormat='mp3',
        Text=word)
    with open(output_file_name, 'wb') as f:
        f.write(resp['AudioStream'].read())

そして、main 関数を以下の通りに修正します。
日本語訳を取得する処理の後に、convert_to_audio 関数を呼び出す処理を追加します。

def main():
    words = ['dog', 'cat', 'hamster']  # 学習したい英単語リスト
    for word in words:
        jpword = translate_en_to_ja(word)
        convert_to_audio(word, 'Joanna', word + '.mp3')
        convert_to_audio(jpword, 'Mizuki', word + '-jp.mp3')

この Python コードを実行すると、以下のオーディオファイルが同一フォルダ上に作成されます。

  • dog.mp3
  • dog-ja.mp3
  • cat.mp3
  • cat-ja.mp3
  • hamster.mp3
  • hamster-ja.mp3

ファイルをオーディオアプリで開いて聞いてみると、「dog」や「犬」などと女性が話すオーディオであることがわかります。

今回は、英語の音声 ID として "Joanna (米国英語 / 女性)" を、日本語の音声 ID として "Mizuki (日本語 / 女性)" を使用しています。Amazon Polly は言語や性別により様々な音声を提供しています。提供している音声はこちらから確認することができます。
 

保存したオーディオファイルを結合する

最後に、保存した英語および日本語訳のオーディオファイルを FFmpeg を使用して 1 つのファイルに統合します。このファイルを日々の学習のために使用することになります。

まず、FFmpeg を用意します。Windows の場合、こちらのページから FFmpeg をダウンロード&展開します。

画像をクリックすると拡大します

展開したフォルダ内の以下の 2 ファイルを、作成している Python コードと同じフォルダに配置します。

  • bin/ffmpeg.exe
  • bin/ffprobe.exe

画像をクリックすると拡大します

そして、Python 経由で FFmpeg を使用してオーディオ結合のために使用する pydub パッケージをインストールします。
pip install pydub
main 関数と main 関数を呼び出す行の間に、以下の merge_audio 関数を追加します。
from pydub import AudioSegment
def merge_audio(words):
    blank = AudioSegment.silent(duration=500)
    audio = blank
    for word in words:
        audio_en = AudioSegment.from_file(word + '.mp3', 'mp3')
        audio_jp = AudioSegment.from_file(word + '-jp.mp3', "mp3")
        audio += audio_jp + blank + audio_en + blank + blank
    audio.export("output.mp3", format="mp3")
この関数では、これまで作成したオーディオファイルを 1 つのオーディオファイル ( output.mp3) に統合して保存します。
このオーディオファイルは、英語音声 → 500 ミリ秒の無音 → 日本語音声 → 1000 ミリ秒の無音 → 英語音声 → ... と繰り返すようになっています。
 
そして、main 関数に merge_audio 関数を呼び出す処理を追加します。以下の通りになります。
def main():
    words = ['dog', 'cat', 'hamster']  # 学習したい英単語リスト
    for word in words:
        jpword = translate_en_to_ja(word)
        convert_to_audio(word, 'Joanna', word + '.mp3')
        convert_to_audio(jpword, 'Mizuki', word + '-jp.mp3')
    merge_audio(words)

この Python コードを実行すると、同一フォルダにオーディオファイル "output.mp3" が作成されます。 

画像をクリックすると拡大します

最終的なコード

最終的な Python コードは以下の通りになります。

import boto3
from pydub import AudioSegment

region = 'ap-northeast-1'
translate = boto3.Session(region_name=region).client('translate')
polly = boto3.Session(region_name=region).client('polly')

def main():
    words = ['dog', 'cat', 'hamster']  # 学習したい英単語リスト
    for word in words:
        jpword = translate_en_to_ja(word)
        convert_to_audio(word, 'Joanna', word + '.mp3')
        convert_to_audio(jpword, 'Mizuki', word + '-jp.mp3')
    merge_audio(words)

def translate_en_to_ja(word):
    resp = translate.translate_text(
        Text=word,
        SourceLanguageCode="en",
        TargetLanguageCode="ja")
    return resp.get('TranslatedText')

def convert_to_audio(word, voiceId, output_file_name):
    resp = polly.synthesize_speech(
        VoiceId=voiceId,
        OutputFormat='mp3',
        Text=word)
    with open(output_file_name, 'wb') as f:
        f.write(resp['AudioStream'].read())

def merge_audio(words):
    blank = AudioSegment.silent(duration=500)
    audio = blank
    for word in words:
        audio_en = AudioSegment.from_file(word + '.mp3', 'mp3')
        audio_jp = AudioSegment.from_file(word + '-jp.mp3', "mp3")
        audio += audio_jp + blank + audio_en + blank + blank
    audio.export("output.mp3", format="mp3")

main()

まとめ

今回は Amazon Translate と Amazon Polly を使用して、簡単なオーディオ型英単語帳を作成しました。Amazon Translate を使用して学習対象の英単語の日本語訳を取得し、Amazon Polly を使用して英単語と日本語訳のオーディオファイルを作成し、最後に 1 つのファイルに統合しました。

コード量も少なく、思ったより簡単に実現できたのではないでしょうか ? AWS AI サービスはアイデア次第で生活を便利にするアプリを簡単に実装することができます。今回は、もともと私自身が欲しくて実装したものの実装方法を紹介させていただきました。私はこれを更に実装したものを毎日使っています。皆様も是非自身の生活を便利にするアプリを AWS サービスを使って開発してみてはいかがでしょうか !


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者紹介

日山 雅之
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト。

2019 年に入社。好きなサービスは AWS Lambda。趣味はサウナ。サウナ歴 13 年。マイベストサウナはサウナ&スパ大東洋か、サウナフジ。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する