Google Cloud上でGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみた

口語調でもすごい認識性能!!
2023.12.02

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

この記事は、ブログリレー『Google CloudのAI/MLとかなんとか』の3本目の記事になります。

今回は、Vertex AIからGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみたいと思います。

Chirpについて

以下に詳しい説明があります。

ChirpはGoogleの次世代音声認識モデルで、現在の音声モデルとは異なるアーキテクチャで学習させたモデルとなっているようです。 Google CloudではCloud Speech-to-Text V2における一つのモデルとして使用できます。その他、Vertex AIの画面の「GENERATIVE AI STUDIO」から呼び出すこともできます。

詳しい処理はGoogle USMの論文に記載があるようです。

ドキュメントによればStreaming用のAPIには対応していないため、ファイルごとのアップロードになるようです。

Chirp is not available on the following API methods:
・v2 Speech.StreamingRecognize
・v1 Speech.StreamingRecognize
・v1 Speech.Recognize
・v1 Speech.LongRunningRecognize
・v1p1beta1 Speech.StreamingRecognize
・v1p1beta1 Speech.Recognize
・v1p1beta1 Speech.LongRunningRecognize

リージョンは以下に対応しています。

  • us-central1
  • europe-west4
  • asia-southeast1

言語は多くのものに対応しており、日本語にももちろん対応しています。

Pricing

Pricingについては以下のページに記載があります。

こちらによると、ChirpはV2のStandardに含まれるようですので、$0.016 / minuteとなっているようです。

コンソールから使ってみた

以降、このChirpを使ってみていきたいと思います。

まずはコンソールから使ってみます。

Cloud Speech-to-TextのAPI有効化

まずは左の一覧から「Speech」を選択します。(見えない場合は、その他のプロダクトで全メニューを開く必要があります)

以下のようにAPIが有効になっていなければ、有効とします。

Vertex AIからGENERATIVE AI STUDIOにアクセス

最初の画面に戻り、左の一覧から「Vertex AI」を選択します。(見えない場合は、その他のプロダクトで全メニューを開く必要があります)

Vertex AIのメニューから「GENERATIVE AI STUDIO」の「音声」を選択します。

Chirpを動かしてみる

タブで「音声文字変換」を選ぶことで使用可能です。右端で言語をJapaneseに設定して音声データを選択します。

最後に、右端メニューの送信を押すと処理が実行されます。結果はテキスト欄に表示されます。

サンプル音声は私の社内勉強会の音声です。冒頭なのでかなり口語調のデータなのですが、それでも正確に認識されました。

お聞き苦しいデータかもしれませんが、その正確性に驚きましたのでそのままアップさせて頂きます。データは以下となります。

「音声を記録します」のメニューを使うと、PCのマイクからの音声を録音して認識が可能です。ただし一度録音を止めてから送信する必要がありますので、リアルタイムでテキストへ変換できないので、その点はご注意ください。

また右端メニューの「SPEECH STUDIOを試す」をクリックすると、Speech-to-Textサービスに遷移し、その他の機能を利用することが可能なようです。こちらは今回扱いませんが、今後機会があれば取り上げたいと思います。

ローカルマシンから使ってみた

次にローカルマシンからPythonコードで使ってみたいと思います。

サービスアカウント作成と認証情報の取得

「IAMと管理」から「サービスアカウント」を選択します。

「サービス アカウントを作成」をクリックします。

以下のように入力して、「作成して続行」を押下します。

ロールは「Cloud Speech 管理者」として「続行」を押下します。

以下は特になにも入力せずに「完了」を押下します。

作成したサービスアカウントをクリックします。

「キー」というタブをクリックします。

「鍵を追加」を押下し、「新しい鍵を作成」を押下します。

「JSON」を選択肢て、「作成」を押下します。

「作成」を押下すると、同時に認証情報が記載されたjsonファイルがダウンロードされます。

Python環境の構築

つづいて、ローカルで必要なPython環境を構築していきます。

まずPythonのバージョンは3.10.13で実行しました。

またパッケージは、お使いのPython環境に合わせてpipなどでインストールしてください。

私はpoetryを使って入れました。

poetry add google-cloud-speech

以下のバージョンのパッケージが入りました。

google-cloud-speech==2.22.0

Pythonコードの実行

以下のリンクにあるtranscribe_chirp.pyというコードを元にコードを実行します。

認証情報が格納されたjsonファイルを、GOOGLE_APPLICATION_CREDENTIALSという環境変数に設定します。

import os

credentials_json_path = "{認証情報が格納されたjsonファイル}"
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentials_json_path

その後、以下のように実行すれば、結果を得ることができました。

from google.cloud.speech_v2 import SpeechClient
from google.cloud.speech_v2.types import cloud_speech
from google.api_core.client_options import ClientOptions

# プロジェクトIDは書き換えてお使いください
project_id = "{プロジェクトID}"

location = "us-central1"

# エンドポイントのロケーション設定が必要
client = SpeechClient(
    client_options=ClientOptions(
        api_endpoint=f"{location}-speech.googleapis.com",
    )
)

# ここの音声ファイルは書き換えてお使いください
with open("sample.wav", "rb") as f:
    content = f.read()

# Chirpモデルをここで指定
config = cloud_speech.RecognitionConfig(
    auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(),
    language_codes=["ja-JP"], # autoでも可
    model="chirp",
)

# Recognizerもエンドポイントと同じロケーションが必要
request = cloud_speech.RecognizeRequest(
    recognizer=f"projects/{project_id}/locations/{location}/recognizers/_",
    config=config,
    content=content,
)

# Transcribes the audio into text
response = client.recognize(request=request)

for result in response.results:
    print(f"Transcript: {result.alternatives[0].transcript}")
Transcript:  画面 共有 よいしょ 画面 見え て ます でしょう か こっち か はい

注意点

上記でOKなのですが、何点か使用するにあたって注意点があったのでご紹介します。

V1とV2の違い

はじめはコンソール上のGENERATIVE AI STUDIOの画面からダウンロードできるコードを使用しており、このコードがV1を使うものとなっていましたので意図しない動作となりました。

このコードは以下のようなコードです。

参考までに、ダウンロードされたコードに基づく記述は以下です。

from google.cloud import speech

# プロジェクトIDは書き換えてお使いください
project_id = "{プロジェクトID}"

# Instantiates a client
client = speech.SpeechClient()

# ここの音声ファイルは書き換えてお使いください
with open("sample.wav", "rb") as f:
    data = f.read()
audio_content = data

# transcribe speech
audio = speech.RecognitionAudio(content=audio_content)

config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=48000, # ここはwavファイルに合わせて変更ください
    language_code="ja-JP",
    model="default",
    audio_channel_count=1,
    enable_word_confidence=True,
    enable_word_time_offsets=True,
)

# Detects speech in the audio file
operation = client.long_running_recognize(config=config, audio=audio)

print("Waiting for operation to complete...")
response = operation.result(timeout=90)

for result in response.results:
    print("Transcript: {}".format(result.alternatives[0].transcript))
Waiting for operation to complete...
Transcript: ごめん今日
Transcript: ごめん見えてますでしょうか

V1で使用可能なモデルは以下です。

V2のChirp以外との違い

次にV2のコードを探し求めて、最初はV2のサンプルコードとして以下を使っておりました。

こちらはmodel="long"となっておりChirpを使わないものになっているため注意が必要です。また、Chirpはglobalのrecoginizerを使えない点も違いとしてありました。

参考までにこちらに沿ったコードも貼っておきます。

# プロジェクトIDは書き換えてお使いください
project_id = "{プロジェクトID}"

# Instantiates a client
client = SpeechClient()

# ここの音声ファイルは書き換えてお使いください
with open("sample.wav", "rb") as f:
    content = f.read()

config = cloud_speech.RecognitionConfig(
    auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(),
    language_codes=["ja-JP"],
    model="long", # ここがlongとなっている
)

request = cloud_speech.RecognizeRequest(
    recognizer=f"projects/{project_id}/locations/global/recognizers/_", # recognizerがglobal
    config=config,
    content=content,
)

# Transcribes the audio into text
response = client.recognize(request=request)

# print(response.results[0].alternatives)

for result in response.results:
    if len(result.alternatives) == 0:
        continue
    print(f"Transcript: {result.alternatives[0].transcript}")
Transcript: ちょっとごめん 共有
Transcript:  よいしょ
Transcript:  ごめん 見えてますでしょうか
Transcript:  こっちか

参考までにV2で使用可能なモデルは以下です。Chirp以外にもいくつかのモデルがあるようです。

まとめ

いかがでしたでしょうか。

今回はGoogle Cloud環境からGoogleの次世代のASR(自動音声認識)モデル「Chirp」を使ってみました。

本記事が活用の参考になれば幸いです。