Edited at

Google APIを使って音声ファイルを自動でテキストに文字起こしする


はじめに

打ち合わせで録音した90分×4ぐらいの音声ファイルを文字起こしする機会があり、初めは2倍速ぐらいで聞いてまとめていたのですが、途中からこれ時間の無駄じゃないかな?今の時代いい感じにやってくれる自動ツールがあるはず!と思い探してみたのがきっかけです。

こんな方法を見つけたので試してみるも、アクティブ状態関係なく入力が止まってしまう状況が発生し上手くいかず。。

そこで見つけたのがGoogle Cloud Speech API。これはいける!と思いさっそく試してみました。


Google Cloud Platformとは

https://cloud.google.com/?hl=ja


Google Cloud Speech APIとは

https://cloud.google.com/speech/?hl=ja


1. アカウント作る


1-1. Googleアカウントを作成


1-2. https://console.cloud.google.com/ にてアカウント作成


2. Google Cloud Speech APIを使う設定をする

Google Cloud Platformコンソール画面のナビゲーションメニューから、「APIとサービス」>「ダッシュボード」>「APIとサービスの有効化」を押して

speechと検索して出てきた以下の2つを有効化を行います。

APIの設定方法については、https://support.google.com/cloud/answer/6158841?hl=jaとかが参考になりそうです。


3. Google Cloud ShellでAPI認証するための設定をする

右上のコンソールボタン(四角いやつ)を押して、Shellを起動します。

(ちなみにgitやphpなどはプリインストールされているみたいです)

ここで念のため、APIをアップデートしておきました。

$ sudo pip install --upgrade google-cloud-speech


3-1. 認証情報を作成する

具体的には、サービスアカウントキーを作成します。


  • キータイプは json

  • 役割は 「Project」>「オーナー」 を選択

ダウンロードしたjsonのファイル名をよしなに変更してから、

Google Cloud Shellにて、ダウンロードした認証用のJSONファイルをアップロードする

$ export GOOGLE_APPLICATION_CREDENTIALS=[jsonのファイル名].json


4. 音声ファイルを準備

使っていたレコーダーアプリ.wav形式だったので、今回はこれをそのまま利用する。


5. Google Cloud Strageの作成

説明 : https://cloud.google.com/storage/?hl=ja

ナビゲーションメニューから、「Storage」>「ブラウザ」を押して

「パケットを作成」を選択

以下のような任意の設定で作成します。

※ 「課金を有効にする」設定を行わないとファイルをアップロードできないようなので、注意

※ 詳しくは、https://cloud.google.com/storage/docs/quickstart-console?hl=jaを参考


6. 音声ファイルをGoogle Cloud Storageにアップする

GUI上で、先ほど作成したGoogle Cloud Storageのパケット内にアップロードします。


7. 文字起こしをする準備

下記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.LINEAR16, # wavの設定
sample_rate_hertz=16000, # ヘルツは音声ファイルに合わせる
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', 'utf-8')

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)



9. 実際に文字起こしをする

$ python transcribe.py gs://[パケット名]/[音声データ名].wav


9-1. ヘルツが設定したものと合っていない時に出るエラー

google.api_core.exceptions.InvalidArgument: 400 Invalid recognition 'config': bad sample rate hertz.

Pythonのヘルツ設定部分を音声ファイルのものと合わせれば解決します。


9-2. 参照エラー

google.api_core.exceptions.PermissionDenied: 403 Cloud Speech API has not been used in project・・・

新規にサービスアカウントを取り直すことで解決することがあるらしいです。


10. 結果の見方

文字起こしの結果は、output****.txtというファイルでカレントディレクトリに作成されます。

jsonファイルをアップした時同様、shellのメニューからローカルにダウンロードすることで確認ができます。

※今回、約60分のwavァイルの書き出しにつき30分ぐらいかかりました。


11. 感想

複数人での打ち合わせで、かつ、人によって声の大きさや特徴も違う(録音音声データ自体が良いものではない)ため、正直そんなには期待をしていませんでした。

結論的には、句読点や改行がないため読みづらいものの、内容を知っている人間であれば読み解くことは可能ぐらいの精度結果となりました。

一目で何を言っているか分かる!ほどではないですが、実際、初めから録音データを聴き直さなくても一目である程度の文脈が分かるわけで結構役にたったりしました!

AWSやMSにも同じようなサービスがあると思うので、今後機会があればそちらも試してみたいと思います。


参考

https://qiita.com/kokky/items/659bde4cdc8ce5c78e29

https://qiita.com/hanlio/items/875b91e0d4931a57e86b