前回は、以下のコードでs3://バケットに配置されたmp3ファイルをtranscribeしてテキストに変換して、jsonファイルをOutputBucketNameのS3;バケットに配置した。
今回は、このjsonファイルを呼び出して、テキスト変換された文章を抽出しようと思います。わざわざ前回コードを出したのは、今回もコードが似ているからです。
s3 = boto3.client('s3')
transcribe = boto3.client('transcribe')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
try:
transcribe.start_transcription_job(
TranscriptionJobName= datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '_Transcription',
LanguageCode='ja-JP',
Media={
'MediaFileUri': 'https://s3.ap-northeast-1.amazonaws.com/' + bucket + '/' + key
},
OutputBucketName='lamoutput'
)
...
raise e
ということで、以下のコードで実施できました。
S3;バケットに保存する方法は参考のとおりにしています。
【参考】
①【AWS Lambdaの基本コードその2】 S3へのファイル保存
②Boto3 で S3 のオブジェクトを操作する(高レベルAPIと低レベルAPI)
参考①のコメントを残しています。ほぼまんまなコードで動きました。
異なるのは、先日のjsonファイルの取り扱い方を取り入れている部分です。
まず、Libは以下のとおり、
# ①ライブラリのimport
import boto3
import urllib.parse
from datetime import datetime
import json
以下は、参考②から真似してclientを定義しています。
print('Loading function') # ②Functionのロードをログに出力
s3 = boto3.resource('s3') # ③S3オブジェクトを取得
client = s3.meta.client
lambda_handlerの入りのbucket, keyの取得は、上記のtranscribeのコードと全く同一です(当然ですが。。)。
# ④Lambdaのメイン関数
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
以下は、参考②と同じコードでjsonファイルから、response['Body']を読込ます。
ところが、ここで躓きました。
つまり、このbody.decode('utf-8')とすれば日本語の文章が表れると思っておりました。が、現実は結構なjson likeな(文字列)が出現。
当初は、これは文字列と気づかず、jsonファイルだと思いました。
ということで、文字列と気づき、さらにjson.loadsでjsonファイルに変換できることが分かり、...やっと以下のコードにたどり着きました。
つまり、bodyは文字列です。
response = client.get_object(Bucket=bucket, Key=key)
body = response['Body'].read()
文字列をjsonファイルに変換します。
dec = json.loads(body)
そして、jsonファイルなるがゆえに以下のように日本語文章が簡単に抽出できました。
con_el=dec["results"]["transcripts"][0]["transcript"]
print('contents=',con_el)
contents= こんにちは 東京 横浜 も 少し 曇り です 声 は 水木 さん です
最後に以下のように指定したs3;バケットにkeyのような時刻入りの.txtとして保存できます。
bucket = 'muauanpub' # ⑤バケット名を指定
key = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.txt' # ⑥オブジェクトのキー情報を指定
file_contents = con_el # 'Lambda test' # ⑦ファイルの内容
obj = s3.Object(bucket,key) # ⑧バケット名とパスを指定
obj.put( Body=file_contents ) # ⑨バケットにファイルを出力
return
###まとめ
・音声ファイルを変換したjsonファイルから文章抽出してs3バケットに保管できた
・これで二段階になっていますが、mp3ファイルをs3バケットに置くと、自動的にそのテキスト変換された文章そのものがs3バケットに保存されるようになりました。
・一応、Teraterm→ec2→s3バケット転送...s3バケットからダウンロード⇒表示は出来ました
・あと、このs3バケットに音声ファイルを転送するアプリとs3バケットのテキストファイルを表示するアプリが出来るとより使いやすい音声ファイル-テキスト変換アプリが出来そうです(Web化)
・変換時間が長くともどちらのLambda関数も非同期起動なので、お金にも時間にも優しいアプリになりそうです