tanakahdaのプログラマ手帳

プログラミングとかソフトウェア開発とかの備忘録

Boto3でテキスト翻訳と音声合成@AWS

import boto3
import contextlib
import pprint
import time
import uuid

TEXT =  """\
こんにちは!
"""
# 音声合成ファイルの名前
FILE_NAME_OF_MP3 = 'q1_out.mp3'
# S3バケット名
S3_BUCKET_NAME = 's3.bucket.name'


def translate(txt):
    """引数の日本語テキストを英語に翻訳します。
    """
    t_obj = boto3.client('translate')
    t_out = t_obj.translate_text(
        Text=txt,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )
    return t_out

def exec_polly(txt):
    """英文テキストを音声合成します。
    
    音声ファイルはカレントディレクトリに「q1_out.mp3」として出力します。"""

    f_out = FILE_NAME_OF_MP3
    p_obj = boto3.client('polly')
    p_out = p_obj.synthesize_speech(
        Text = txt,
        OutputFormat = 'mp3',
        VoiceId='Joanna'
    )
    with contextlib.closing(p_out['AudioStream']) as a_stream:
        with open(f_out, 'wb') as file:
            file.write(a_stream.read())


def exec_upload_s3(f_name, b_name, k_name):
    """S3へファイルをアップロードします。
    """
    s3_obj = boto3.client('s3')
    s3_obj.upload_file(f_name, b_name, k_name)


def exec_transcribe(b_name, k_name):
    """S3に格納された英語音声ファイルを文字起こしします。
    """
    
    t_obj = boto3.client('transcribe', 'ap-northeast-1')
    jobID = str(uuid.uuid1())
    t_out = t_obj.start_transcription_job(
        TranscriptionJobName=jobID,
        Media={'MediaFileUri': 's3://' + b_name + '/' + k_name},
        MediaFormat='mp3',
        LanguageCode='en-US'
    )
    pprint.pprint(t_out)

    while True:
        t_out = t_obj.get_transcription_job(TranscriptionJobName=jobID)
        status = t_out['TranscriptionJob']['TranscriptionJobStatus']
        if status != 'IN_PROGRESS':
            break
        time.sleep(5)
    print(status)
    pprint.pprint(t_out)

if __name__ == '__main__':
    t_out = translate(TEXT)
    exec_polly(t_out.get('TranslatedText'))
    exec_upload_s3('./' + FILE_NAME_OF_MP3,\
                   S3_BUCKET_NAME, FILE_NAME_OF_MP3)
    exec_transcribe(S3_BUCKET_NAME, FILE_NAME_OF_MP3)