Edited at

Google Cloud Speech APIで音声の自動文字起こし

More than 1 year has passed since last update.


カンファレンスやインタビュー音源を自動文字起こしする夢

2017年8月にAPIがアップデートされ、最長3時間までの音声が利用できるようになったため、

音声データ→txtファイル変換に挑戦してみました。

インタビューを取ったらすぐに自動書き起こしできるよう、環境は外出先でも使えるGCPのクラウドコンソールを使います。

※参考

http://jp.techcrunch.com/2017/08/15/20170814google-updates-its-cloud-speech-api-with-support-for-more-languages-word-level-timestamps/


環境・言語など


  • Google Cloud Speech API

  • Google Cloud Storage

  • python


Speech APIを有効にする

以下URLを参考にSpeech APIを有効にします。

音声60分までは無料、その後は15秒ごとに0.6セント課金されますが、Google Cloud Platformを初めて使う場合は1年間有効な300ドルが付与されます(2017年8月現在)

https://cloud.google.com/speech/docs/getting-started

認証情報は、サービスアカウントキーファイル(JSON形式)で作成しておきます。


Google Cloud ShellでAPI認証する

Google Cloud Shellを立ち上げ、右上のあたりから、認証用のJSONファイルをアップロードします。

image2017-8-22_11-46-50.png

アップロードしたら、JSONファイルで認証します。

$ export GOOGLE_APPLICATION_CREDENTIALS=hogehoge.json


音声ファイルを作成

mp3やAACなどをそのまま利用することはできず、対応した形式に変換する必要があります。いろいろ試しましたが、以下の設定がおすすめです。


  • FLAC

  • モノラル

  • 16000Hz

  • 16bit

(参考:オンラインの変換サービス)

https://audio.online-convert.com/convert-to-flac


変換

FLACファイルを、Google Cloud Strageにアップロードします。

Google Cloud Strageの作り方はこちら

https://cloud.google.com/storage/docs/quickstart-console?hl=ja

pythonファイルは、シェルの方に直接アップロードしました。本業エンジニアではないので、チュートリアル見ながらゴニョゴニョ…


transcribe.py

# !/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(
encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
language_code='ja-JP')

operation = client.long_running_recognize(config, audio)

print('Waiting for operation to complete...')
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)


最後に、以下を実行してしばらく待つと、変換が終了します。

$ python transcribe.py gs://バケット名/testmusic.flac


注意


  • ファイルは最長3時間まで

  • 1時間の音声書き起こしに、15分程度かかる

  • 話し言葉なので、句読点は全くない(英語版は句読点を自動付与できるようになったらしいので、日本語版のリリースが待たれます)

  • たまに「ヘルツ設定が違うよ」というエラーが出るので、その際はpythonファイルにサンプリングレートの値を設定してあげる

config = types.RecognitionConfig(

encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
sample_rate_hertz=16000, #この行を追加
language_code='ja-JP')


  • 久しぶりに利用しようとしたら、ImportError: cannot import name speech が出るようになったので、updateした

sudo pip install --upgrade google-cloud-speech


精度(所感)


精度に関係しないもの


  • マイクの感度

  • 話すスピード

  • ノイズ


精度に関係するもの


  • 話者の話し方(明瞭かどうか)

  • 部屋の反響

部屋の反響は相当精度に影響するのが意外。空調の音等のノイズは、かなりうるさくても精度に影響しませんでした。分離しやすいのかもしれません。