AWS Transcribeで録音した音声を文字起こししてみた

議事録の作成の手間が省けるといいんだけど。。。

AWS Transcribeで録音した音声を文字起こししてみた
目次

TL;DR


本記事でわかることは以下の通りです。

☆ aws transcribeの使い方
☆ lambdaの基本的な文法
☆ 音声を文字起こしするまでの手順

 

構築図


transcribe.png

input bucketへのアップロードをトリガーに音声ファイルを文字起こしの処理が走る想定です。

 

手順


1. bucketの作成(インプットとアウトプット用の2つ)
2. IAMロールの作成
3. transcribe_functionの作成
4. output bucketの中身を確認

 

1. S3バケットの作成


Lambdaのトリガー設定時に、下記のような注意書きがあるように、入出力のバケットは分けた方が良い
スクリーンショット 2021-12-12 14.11.03.png

 

2. IAMロールの作成


スクリーンショット 2021-12-12 14.15.44.png

S3とTranscribeへのフルアクセス権限を付与
操作内容が明白な場合は絞り込んだ方が良いが、個人環境なので、一旦はフルアクセス権限を付与

 

3. Lambda関数の作成


設計図の使用を選択して、関数を作成する

スクリーンショット 2021-12-12 14.12.55.png

  • 既存のロールに先ほど作成したロールを選択
  • s3トリガーにinput bucketを指定する

スクリーンショット 2021-12-12 14.18.08.png

 

import json
import urllib.parse
import boto3
import datetime

s3 = boto3.client('s3')
transcribe = boto3.client('transcribe')

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    
    # Get the object from the event and show its content type
    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
            },
            Setting={
                'ShowSpeakerLabels': 'True',
                'MaxSpeakerLabels': 2,
            },
            OutputBucketName='your-output-bucket-name'
        )
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

 

input bucket の情報取得している箇所

import boto3
s3 = boto3.client('s3')

#トリガーとなるインプットバケットからバケットとオブジェクト名を取得
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

 

transcribeの実装箇所

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
            },
            Setting={
                'ShowSpeakerLabels': 'True',
                'MaxSpeakerLabels': 2,
            },
            OutputBucketName='your-output-bucket-name'
        )
  • transcribejobは一意である必要があるため、date関数を使用
  • 言語は、日本語を指定
  • スピーカーの数を指定

その他、パラメータの詳細は下記を参照

https://docs.aws.amazon.com/ja_jp/transcribe/latest/dg/API_StartTranscriptionJob.html

 

4. output bucketの中身を確認


テキスト化されたファイルがjson形式で出力されていれば一連の処理は成功です。
ただ、インデントが整形されていないので、 以下のような整形ツールを使用して人間にも優しい形にしましょう。

https://tools.m-bsys.com/development_tooles/json-beautifier.php

 

まとめ


試しにtranscribeを使用してみましたが、性能がイマイチなような気がしています。
(録音環境にもよると思うので一概には言えませんが。。)

AWS Transcribe 側で文字起こし性能を向上させるためにできることとしては

  • スピーカーの数を指定
  • カスタム語彙(固有名詞、専門用語)の登録

でしょうか。

議事録作成の手間を少しでも省ければと思いましたが、もう少し試行錯誤が必要そうです。