kumilog.net

データ分析やプログラミングの話などを書いています。

ボイスメモをGoogle Speech APIで文字起こし

f:id:xkumiyu:20181203002631p:plain

はじめに

iPhoneの標準アプリであるボイスメモですが、使い勝手も良いため、会議での議事録作成のためや語学レッスンなんかで使っている方も多いかと思います。議事録作成で使う場合、文字起こしを手動で行うのは大変なため、自動でできると良いですね。

そこで、Google Speech APIで音声のテキスト化を行ってみます。また、GCPのWebコンソールは使わずにCLIだけでやってみます。GCPのアカウントは事前に用意しておいてください。

ちなみに、iPhoneのマイクは本体の底の方にあるので、ボイスメモ録音するときは向きに注意すると良いです。

音声ファイルの変換

iOSで録音したボイスメモのファイルはm4a拡張子になっていますが、このままではGoogle Speech APIで扱うことができないので、flacファイルに変換します。

$ ffmepg -i memo.m4a memo.flac

なお、ffmepgは

$ brew install ffmpeg

でインストールできます。

また、Convert audio to the FLAC formatではオンライン上で変換できます。

GCPの準備

Google Cloud SDK のインストール

CLIでGCPを操作するために、Google Cloud SDKをインストールします。

$ brew cask install google-cloud-sdk

次に、初期設定を行います。

$ gcloud init
You must log in to continue. Would you like to log in (Y/n)?

と聞かれたら、yを押すとWebブラウザが開くので、GCPのアカウントでログインします。

次に、どのプロジェクトを使うか聞かれますが、今回は新規プロジェクトを用意します。

Pick cloud project to use:
 [1] xxxx
 [2] Create a new project
Please enter numeric choice or text value (must exactly match list
item): 2

プロジェクトの作成と設定

今回、用いるプロジェクトを作成します。プロジェクト名はグローバルで一意である必要があります。

$ gcloud projects create project-hogehoge

作成できたか確認してみます。

$ gcloud projects list
PROJECT_ID        NAME              PROJECT_NUMBER
project-hogehoge  project-hogehoge  1234567890
...

作成したプロジェクトをデフォルトにします。

$ gcloud config set project project-hogehoge

Storage へアップロード

bucketの作成

ファイルをアップロードする前に、bucketを作成します。bucket名もグローバルで一意である必要があります。

$ gsutil mb -c regional -l asia-northeast1 gs://bucket-hogehoge

もし、存在する名前の場合、409エラーになります。

ServiceException: 409 Bucket bucket-hogehoge already exists.

作成できたか確認してみます。

$ gsutil ls
gs://bucket-hogehoge/

ファイルのアップロード

変換したボイスメモのflacファイルを、作成したbucketにアップロードします。

$ gsutil cp memo.flac gs://bucket-hogehoge/memo.flac

アップロードできたか確認してみます。

$ gsutil ls gs:///bucket-hogehoge/
gs://bucket-hogehoge/memo.flac

Google Speech API を使う

Speech APIの実行

それでは、準備が整いましたので、Google Speech APIを使ってみます。

$ gcloud ml speech recognize-long-running 'gs://bucket-hogehoge/memo.flac' --language-code='ja-JP' --async

初めてGoogle Speech API を使う場合は、APIを有効化するか聞かれるので、有効化します。

API [speech.googleapis.com] not enabled on project [1234567890].
Would you like to enable and retry (this will take a few minutes)?
(y/N)? y

その後、IDのような数字が返ってくるので控えておきます。

Check operation [1234567890] for status.
{
  "name": "1234567890"
}

結果の確認

先程の数字を入力すると、結果を確認できます。

$ gcloud ml speech operations describe 1234567890
{
  "done": true,
  ...
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "confidence": 0.8733476,
            "transcript": "\u30dc\u30a4\u30b9\u30e1\u30e2\u306e\u6587\u5b57\u8d77\u3053\u3057\u3092\u81ea\u52d5\u7684\u306b\u884c\u3046"
          }
  ...

処理には音声の長さに応じて時間がかかります。処理が完了していると、json形式で信頼度とともに結果が返ってきます。

$ gcloud ml speech operations describe 1234567890 | jq -r '.response.results[].alternatives[].transcript'
ボイスメモの文字起こしを自動的に行う

jqを使うと、jsonをパースできUnicodeもデコードしてくれます。結果が複数ある場合は、複数表示します。

なお、結果はダミーですが、漢字にも変換してくれます。

まとめ

Google Speech APIを使ってボイスメモのテキスト変換を行ってみました。

結果は記載しませんでしたが、普通の会話を録音したものは結構微妙な精度で、議事録の自動作成には少し遠いなと感じました。朗読のようにはっきりゆっくり読めば、なかなかの精度で返してくれました。