日本語の音声認識の市場調査と軽く触ってみた


はじめに

この記事の対象は、日本語の音声認識をする人を対象としています。

本記事で扱う音声認識は、mp3などのファイルに固定のファイルを想定しています。
ストリーミングしたリアルタイム性のある音声認識は対象外です。

サービスの紹介と、その特徴

サービス名 料金 動作環境 コメント
Google Speech-to-Text 0~60分:無料トライアル
60分超~100万分まで:$0.006/15 秒**
API 簡単に利用できた
Amazon Transcribe 250,000分まで0.00040USD API S3挟まないと動かない
Azure Speech Services 1 か月あたり 5 音声時間は無料 API 触ったことがなく、詳しくないです。
AmiVoice API:0.0275円/秒〜
スタンドアロンはお問合せから
APIもあるし、スタンドアロン環境のwindowsで可能 お高いらしい。触ったことがなく、詳しくないです。
julius 無料※BSDライセンス windows、Linux 無料でするならこれ一択
環境構築構築が大変で、単語辞書や文法規則から準備する必要もある。

動かしてみる

Amazon Transcribe

コンソール画面からの動作はこちら
音声認識の流れはS3に音声ファイルを保存し、保存したファイルに向けたジョブを作成し、作成したジョブで判定た判定結果をS3に保存する流れでした。
そのため、音声認識にはAWSにログインして、S3にファイルをあげることとジョブの作成が必要でした。

プログラムからの動作はこちら

コンソール画面とやっていることは原則同じです。S3に音声ファイルをアップロードし、ジョブを作成し、その結果をS3に保存します。その結果のS3にはjsonが出力されるので、出力結果をみる感じでした。

#!/usr/bin/env python3
from __future__ import print_function
import time
import boto3
transcribe = boto3.client('transcribe')
job_name = "job_name"
job_uri = "s3://DOC-EXAMPLE-BUCKET1/key-prefix/file.file-extension"
transcribe.start_transcription_job(
    TranscriptionJobName=job_name,
    Media={'MediaFileUri': job_uri},
    MediaFormat='wav',
    LanguageCode='en-US'
)
while True:
    status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
    if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
        break
    print("Not ready yet...")
    time.sleep(5)
print(status)
{
  "jobName": "job_name",
  "accountId": "*************",
  "results": {
    "transcripts": [
      {
        "transcript": "こんにちは"
      }
    ],
    "items": [
      {
        "start_time": "1.27",
        "end_time": "1.96",
        "alternatives": [
          {
            "confidence": "0.9992",
            "content": "こんにちは"
          }
        ],
        "type": "pronunciation"
      }
    ]
  },
  "status": "COMPLETED"
}

google speech to text

サンプルプログラムを以下に記載します。
APIの返り値が認識結果がだけと、かなりシンプルな仕組みになっていました。
あと準備もほとんどしなくてよくて、結構簡単でした。

#!/usr/bin/env python3
import speech_recognition


def api_google():
    file_path = "./voice_file.wav"

    r = speech_recognition.Recognizer()
    with speech_recognition.AudioFile(file_path) as src:
        audio = r.record(src)

    result = r.recognize_google(audio, language='ja-jp')
    print(result)


if __name__ == "__main__":
    api_google()

"""
$ ~/python3 google_api_sound.py 
こんにちは
"""

Azure

Azureはアカウントを持っていないため、紹介だけになります。Azureはデモがありました。

公式のドキュメントはこちら。
短い音声(simple)の場合は、JSONが帰ってきて、DisplayTextに認識内容が入るようです。

{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}

AmiVoice

触ったことがないため、割愛します。

julius

下の画像はjuliusを起動し、hello.wavファイルを読み込ませた画像です。

デフォルトで付属されている単語と文法で、 (果物)が(何個)あります。 の音声認識ができます。
この固定の文章以外で音声認識したい場合は、単語と文法規則の両方の設定ファイルを作成する必要があります。
また、出力結果の画像を下に記載します。
下の出力結果から、sentence1を抜き出して音声認識の結果として出力します。

環境構築にすごく苦戦しました。
3回は環境構築しましたが、その度に何かしらエラーがでてサクサク環境構築はできなかったです。
以下は環境構築で苦戦したことを箇条書きで書き出します。

まとめ

前回の合成音声に続き音声認識もまとめました。
大きな流れとして、大企業が精度の良いものをAPIとして開発し、その出来上がっているものを使って、サービスに注力できるようになってるみたいです。

クラウド化した世界で、APIを使ったオンラインでの音声認識が主流になっており、オンプレ環境の音声認識はamiVoiceが一択の雰囲気でした。
無料でするならJuliusですが、本記事でも書いてる他ググったらわかるように、環境構築がかなり苦戦します。また教え込んだ文章しか音声認識できず、使用場面は限られると思います。