WAVファイルをCloud Speech APIで文字起こしする


目的

WAVファイル音声をGoogle Cloud Speech-to-Text APIで文字起こしする方法を説明します.FLACファイルの文字起こし方法の記事を参考にして,WAVファイルの文字起こしを行いました.この方法なら,FLAC形式に変換しなくても文字起こしを行うことができるようになります.

コードはこちら

【重要】 WAVファイルの準備

Cloud Speech-to-Text APIはWAVファイルのヘッダ情報から文字起こしに必要な情報を得るため,音声変換したいWAVファイルのヘッダが正常かどうか事前に確認する必要があります.ヘッダ情報の中で確認すべき情報は,PCMかどうか(fmt_wave_format_type)とサンプリング周波数(fmt_samples_per_sec)です.

Cloud Speech-to-Text APIの仕様を確かめたい方は,VSCodeからRecognitionConfigに定義元ジャンプしてください.

WAVファイルヘッダの確認

PythonでWAVEファイルのヘッダ情報の読み取りの記事に書かれているプログラムを動かしてヘッダ情報を確かめます.

正常なWAVファイル

  • fmt_samples_per_sec: 8000〜48000(16000が最適)
  • fmt_wave_format_type: 1 (PCMを指す)

ダメなWAVファイル例

  • fmt_samples_per_sec: 0
  • fmt_wave_format_type: 0

ダメな形式のWAVファイルだった場合

こちらを参考にMacのデフォルトの「ミュージック」アプリを使ってWAVファイルを書き出すとうまく動きました!

【注意】 iMovieで書き出したWAVファイルやQuickTimePlayerで編集したWAVファイルはヘッダが正常でないので動かせませんでした!

サービスアカウントキーの作成

基本的にFLACファイルの文字起こし方法の記事を参考にして,jsonキーの作成を行なってください.

【注意】今回はGoogle Cloud StorageにアップロードしたWAVファイルを文字起こしするので,サービスアカウント にCloud Storageのアクセス権を付与する必要があります.

ロールにStorageオブジェクト閲覧者を追加してください.

Cloud Storageのアクセス権がないサービスアカウントを用いると次のように怒られるはずです.

PermissionDenied: 403 hogehoge does not have storage.objects.get access to the Google Cloud Storage object.

サービスアカウントキーのパスを環境変数に設定する

先ほどダウンロードしたjsonファイルのパスを環境変数に設定します.

export GOOGLE_APPLICATION_CREDENTIALS=./hoge.json

WAVファイルをCloud Storageにアップロード

FLACファイルの文字起こし方法の記事を参考にして,WAVファイルをCloud Storageにアップロードしてください.オブジェクトの詳細画面を見ると,gsから始まるCloud Storage内のリソースへのファイルパスが確認できます.

文字起こしスクリプト

FLACファイルの文字起こし方法の記事を参考にして,作成させていただきました.

transcribe.py
# # !/usr/bin/env python
# coding: utf-8
import argparse
import datetime


def transcribe(gcs_uri):
    from google.cloud import speech_v1 as speech
    from google.cloud.speech_v1 import types
    client = speech.SpeechClient()
    audio = types.RecognitionAudio(uri=gcs_uri)
    # 音声ファイルのヘッダに書かれているので, サンプリング周波数は指定しなくて良い
    config = types.RecognitionConfig(language_code='ja-JP')
    operation = client.long_running_recognize(config, audio)

    operationResult = operation.result()
    now = datetime.datetime.now()
    print('Waiting for operation to complete...')

    with open('./{}.txt'.format(now.strftime("%Y%m%d-%H%M%S")), mode='w') as f:
        for result in operationResult.results:
            print("Transcript: {}".format(result.alternatives[0].transcript))
            print("Confidence: {}".format(result.alternatives[0].confidence))
            f.write('{}\n'.format(result.alternatives[0].transcript))


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'path', help='cloud storage path start with gs://')
    args = parser.parse_args()
    transcribe(args.path)

文字起こしスクリプトの実行

引数にgs://から始まるCloud Storage内のリソースへのファイルパスを指定し,スクリプトを実行してください.

python transcribe.py gs://hogehoge.wav

結果

標準出力とテキストファイルとして結果が出てきます.

Transcript: 登録できそうなら
Confidence: 0.8765763640403748
Transcript: いた方がいいんじゃないかな
Confidence: 0.8419854640960693
20201022-010101.txt
登録できそうなら
いた方がいいんじゃないかな

参考