Python で Speech-to-Text API を使用する

1. 概要

9e7124a578332fed.png

Speech-to-Text API を使用すると、使いやすい API で高度なニューラル ネットワーク モデルを適用し、音声を 125 以上の言語と言語変種のテキストに変換できます。

このチュートリアルでは、Python での Speech-to-Text API の使用に焦点を当てます。

学習内容

  • 環境の設定方法
  • 音声ファイルを英語で文字起こしする方法
  • 単語のタイムスタンプを含む音声ファイルを文字変換する方法
  • 音声ファイルをさまざまな言語で文字起こしする方法

必要なもの

  • Google Cloud プロジェクト
  • ブラウザ(ChromeFirefox など)
  • Python の使用経験

アンケート

このチュートリアルをどのように使用されますか?

通読のみ 通読して演習を行う

Python のご利用経験はどの程度ありますか?

初心者 中級者 上級者

Google Cloud サービスの利用経験をどのように評価されますか。

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では Cloud 上で動作するコマンドライン環境である Cloud Shell を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 853e55310c205094.png をクリックします。

3c1dabeca90e44e5.png

Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。

9c92662c6a846a5c.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

9f0e51b578fecce5.png

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。

Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. 環境のセットアップ

Speech-to-Text API を使用する前に、Cloud Shell で次のコマンドを実行して API を有効にします。

gcloud services enable speech.googleapis.com

次のように表示されます。

Operation "operations/..." finished successfully.

これで Speech-to-Text API を使用できるようになりました。

ホーム ディレクトリに移動します。

cd ~

依存関係を分離する Python 仮想環境を作成します。

virtualenv venv-speech

仮想環境をアクティブにします。

source venv-speech/bin/activate

IPython と Speech-to-Text API クライアント ライブラリをインストールします。

pip install ipython google-cloud-speech

次のように表示されます。

...
Installing collected packages: ..., ipython, google-cloud-speech
Successfully installed ... google-cloud-speech-2.25.1 ...

これで、Speech-to-Text API クライアント ライブラリを使用する準備が整いました。

次の手順では、前のステップでインストールした IPython というインタラクティブな Python インタープリタを使用します。Cloud Shell で ipython を実行してセッションを開始します。

ipython

次のように表示されます。

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

最初のリクエストを行う準備ができました...

4. 音声ファイルを文字に変換する

このセクションでは、英語の音声ファイルを文字起こしします。

次のコードを IPython セッションにコピーします。

from google.cloud import speech


def speech_to_text(
    config: speech.RecognitionConfig,
    audio: speech.RecognitionAudio,
) -> speech.RecognizeResponse:
    client = speech.SpeechClient()

    # Synchronous speech recognition request
    response = client.recognize(config=config, audio=audio)

    return response


def print_response(response: speech.RecognizeResponse):
    for result in response.results:
        print_result(result)


def print_result(result: speech.SpeechRecognitionResult):
    best_alternative = result.alternatives[0]
    print("-" * 80)
    print(f"language_code: {result.language_code}")
    print(f"transcript:    {best_alternative.transcript}")
    print(f"confidence:    {best_alternative.confidence:.0%}")
    

コードを読み、recognize クライアント ライブラリのメソッドを使用して音声ファイルを文字変換する様子をご覧ください**。config パラメータはリクエストの処理方法を示し、audio パラメータは認識される音声データを指定します。

リクエストを送信します。

config = speech.RecognitionConfig(
    language_code="en",
)
audio = speech.RecognitionAudio(
    uri="gs://cloud-samples-data/speech/brooklyn_bridge.flac",
)

response = speech_to_text(config, audio)
print_response(response)

次の出力が表示されます。

--------------------------------------------------------------------------------
language_code: en-us
transcript:    how old is the Brooklyn Bridge
confidence:    98%

構成を更新して句読点入力の自動化を有効にして、新しいリクエストを送信します。

config.enable_automatic_punctuation = True

response = speech_to_text(config, audio)
print_response(response)

次の出力が表示されます。

--------------------------------------------------------------------------------
language_code: en-us
transcript:    How old is the Brooklyn Bridge?
confidence:    98%

概要

このステップでは、さまざまなパラメータを使用して英語で音声ファイルを文字変換し、結果を出力することができました。詳しくは、音声ファイルの文字変換をご覧ください。

5. 単語のタイムスタンプを取得する

Speech-to-Text では、文字起こしされた音声の時間オフセット(タイムスタンプ)を検出できます。時間オフセットは、提供された音声で発話された各単語の開始と終了を示します。時間オフセット値は、音声の開始からの経過時間を 100 ミリ秒単位で表します。

単語のタイムスタンプを含む音声ファイルを文字変換するには、次のコードを IPython セッションにコピーしてコードを更新します。

def print_result(result: speech.SpeechRecognitionResult):
    best_alternative = result.alternatives[0]
    print("-" * 80)
    print(f"language_code: {result.language_code}")
    print(f"transcript:    {best_alternative.transcript}")
    print(f"confidence:    {best_alternative.confidence:.0%}")
    print("-" * 80)
    for word in best_alternative.words:
        start_s = word.start_time.total_seconds()
        end_s = word.end_time.total_seconds()
        print(f"{start_s:>7.3f} | {end_s:>7.3f} | {word.word}")
        

コードを読み、単語のタイムスタンプ*を含む音声ファイルを文字変換する方法をご確認ください。*enable_word_time_offsets パラメータは、各単語の時間オフセットを返すように API に指示します(詳しくはドキュメントをご覧ください)。

リクエストを送信します。

config = speech.RecognitionConfig(
    language_code="en",
    enable_automatic_punctuation=True,
    enable_word_time_offsets=True,
)
audio = speech.RecognitionAudio(
    uri="gs://cloud-samples-data/speech/brooklyn_bridge.flac",
)

response = speech_to_text(config, audio)
print_response(response)

次の出力が表示されます。

--------------------------------------------------------------------------------
language_code: en-us
transcript:    How old is the Brooklyn Bridge?
confidence:    98%
--------------------------------------------------------------------------------
  0.000 |   0.300 | How
  0.300 |   0.600 | old
  0.600 |   0.800 | is
  0.800 |   0.900 | the
  0.900 |   1.100 | Brooklyn
  1.100 |   1.400 | Bridge?

概要

このステップでは、単語のタイムスタンプが付いた英語の音声ファイルを文字変換し、結果を出力できました。詳しくは、単語のタイムスタンプを取得するをご覧ください。

6. さまざまな言語の文字起こし

Speech-to-Text API は 125 以上の言語と方言を認識できます。サポートされている言語の一覧については、こちらをご覧ください。

このセクションでは、フランス語の音声ファイルを文字起こしします。

フランス語の音声ファイルを文字に変換するには、IPython セッションに以下のコードをコピーしてコードを更新します。

config = speech.RecognitionConfig(
    language_code="fr-FR",
    enable_automatic_punctuation=True,
    enable_word_time_offsets=True,
)
audio = speech.RecognitionAudio(
    uri="gs://cloud-samples-data/speech/corbeau_renard.flac",
)

response = speech_to_text(config, audio)
print_response(response)

次の出力が表示されます。

--------------------------------------------------------------------------------
language_code: fr-fr
transcript:    Maître corbeau sur un arbre perché Tenait dans son bec un fromage maître Renard par l'odeur alléché lui tint à peu près ce langage et bonjour monsieur du corbeau.
confidence:    94%
--------------------------------------------------------------------------------
  0.000 |   0.700 | Maître
  0.700 |   1.100 | corbeau
  1.100 |   1.300 | sur
  1.300 |   1.600 | un
  1.600 |   1.700 | arbre
  1.700 |   2.000 | perché
  2.000 |   3.000 | Tenait
  3.000 |   3.000 | dans
  3.000 |   3.200 | son
  3.200 |   3.500 | bec
  3.500 |   3.700 | un
  3.700 |   3.800 | fromage
...
 10.800 |  11.800 | monsieur
 11.800 |  11.900 | du
 11.900 |  12.100 | corbeau.

概要

このステップでは、フランス語の音声ファイルを文字変換し、結果を出力することができました。詳しくは、サポートされている言語をご覧ください。

7. 完了

9e7124a578332fed.png

Python で Speech-to-Text API を使用して、音声ファイルに対してさまざまな種類の音声文字変換を行う方法を学びました。

クリーンアップ

Cloud Shell から開発環境をクリーンアップするには:

  • IPython セッションをまだ開いている場合は、シェルに戻ります(exit)。
  • Python 仮想環境の使用を停止します: deactivate
  • 仮想環境フォルダ cd ~ ; rm -rf ./venv-speech を削除します

Cloud Shell から Google Cloud プロジェクトを削除するには:

  • 現在のプロジェクト ID PROJECT_ID=$(gcloud config get-value core/project) を取得します。
  • 削除するプロジェクトが echo $PROJECT_ID であることを確認します。
  • プロジェクトを削除します。gcloud projects delete $PROJECT_ID

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。