音声をテキストに(google speech-to-text API)

プログラミング

あいかわらずこのジャンルについてやらざるを得ないことがありまして。。。

ただ、ここ2年くらいで急速に「音声をテキストにする」技術は進んでます。
理由は「OK! グーグル」か「アレクサ!」のおかげ。

ノイズがある中で言葉を聞き分ける技術が急速に進歩していてAIが活用されているひとつの分野となっているようです。

でも残念なことに音声ファイルを食わせてテキストにする無料サービスはないようだし、あってもバカ高くなると思います。

理由はGoogle APIなどが代表的で一定時間使うと課金が発生することと、結構プログラムを長時間走らせないといけない(非同期モード)。

巷のサンプルを見ながらやったのですが、Google Cloud Platform Shellを使う方法はダメです。失敗します。
理由はシェルはちょっと使うためのもので、長時間プログラムを走らせると途中で打ち切られます。

21世紀の文字起こし(3)などはなかなか丁寧に動かし方を書いてくれています。

が、長時間の音声は必要なかったのでしょうね。

ローカル(自分のPC)で実行しなきゃ、1時間以上の音声ファイル(FLAC, 16000Hz、モノラル)の処理はできません。相当な時間がかかります。(それに気づくまで4回くらい失敗したよー)
上の記事プラス、ローカルで実行する時の注意点だけ書いておきます。

  1. もちろんPythonをインストールしておく
  2. 上の記事で「Cloud ShellにJSONファイルをアップロード」あたりからローカルのシェルで作業
  3. PIPコマンドでargparseやgoogle-cloud-speechをインストールしておく
  4. Googleから使用権を確認するJSONファイルをダウンロードして、
    export GOOGLE_APPLICATION_CREDENTIALS=xxxxx.json を宣言しておく
  5. 音声ファイルはGoogle Cloud Platformのストレージにしか置けない。
    ローカルのファイルではエラーになる。ファイル名は必ずgs://から始まることになる。

上の項目くらいに気をつければローカルで動作させることができました。
 
プログラムはよくあるものを使っています。

#!/usr/bin/env python
# coding: utf-8
import argparse
import io
import sys
import codecs
import datetime
import locale

def transcribe_gcs(gcs_uri):
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    client = speech.SpeechClient()

    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
        sample_rate_hertz=16000,
        encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
        language_code='ja-JP') # en-US ja-JP

    operation = client.long_running_recognize(config, audio)

    print('Waiting for operation completion...')
    operationResult = operation.result()

    d = datetime.datetime.today()
    today = d.strftime("%Y%m%d-%H%M%S")
    fout = codecs.open('output{}.txt'.format(today), 'a', 'shift_jis')

    for result in operationResult.results:
        for alternative in result.alternatives:
             fout.write(u'{}\n'.format(alternative.transcript))
    fout.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description = __doc__,
        formatter_class = argparse.RawDescriptionHelpFormatter)

    parser.add_argument(
        'path', help='GCS path for audio file to be recognized')
    args = parser.parse_args()
    transcribe_gcs(args.path)
    print('Transaction End')

 

インタビューの文字起こしで業者に頼むよりは精度は高いようです。
Google APIの課金って得られる結果からしたら、微々たるものです。

コメント