音声から文字を起こすサービス「Google Cloud Speech-to-Text API」をPythonで利用してみる

2023年11月20日 Posted 野々瀨(フロントエンドエンジニア)

近年、いろいろなところで音声認識システムが活用されています。例えば、AppleのSiriやAmazonのAlexa、UDトーク、その他AIロボットなど。そんな音声認識システムのサービスを利用して、Pythonで音声情報から文字を起こす方法をご紹介します。

音声から文字を起こすAPIサービス

音声から文字を起こすAPIを提供しているサービスは、次のように幾つかあります。

今回はGoogle CloudのSpeech-to-Textというサービスを利用した例をご紹介します。

Speech-to-Textサービスについて

Google CloudのSpeech-to-Textというサービスは、音声データを基に文字を起こしてくれるAPIサービスです。マイクからのリアルタイムな音声や音声ファイルから文字を起こすことができます。

料金

Google CloudのSpeech-to-Textは、1カ月あたりの処理時間(分)で料金が決まります。1月に0~60分までの時間であれば無料で利用することができ、60分を超過すると課金されます。また、処理の内容によっても料金が異なります。詳しくは、次の料金表ページをご覧ください。

Speech-to-Text の料金

この記事を書いている2023年時点では、初回で300ドル分の無料トライアルクレジットが用意されていますので、お試しの際はぜひご利用ください。

事前準備

次の内容を事前にご準備ください。

Google Cloudの設定

APIの有効化

「+APIとサービスの有効化」リンクを押します。

検索の入力欄に「Speech to Text」を入力し、Enterキーを押します。

結果一覧にある「Cloud Speech-to-Text API」を押します。

「有効にする」ボタンを押します。この時、プロジェクトに対して支払い設定がされていない場合は、「課金が必要」というダイアログが表示されますので、「課金を有効にする」ボタンを押して、「請求先アカウントを作成」してください。

Speech-to-Text APIの詳細画面が表示されれば完了です。

サービスアカウントの作成

Google Cloud consoleでプロジェクトを選択し、トップ画面からクイック アクセスの「IAMと管理」リンクを押します。

左側のサイドメニューにあります「サービス アカウント」メニューを押します。

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

「サービス アカウント名」、「サービス アカウント ID」を入力し、「作成して続行」ボタンを押します。この時、「サービス アカウント ID」は、「サービス アカウント名」を入力することで、自動的に作成されますので、任意で決めなくても、そのまま自動生成されたIDで作成することも可能です。

なお、後ほど使用するため、「サービス アカウント ID」の下に表示されているメールアドレスをコピーしておいてください(後からでも確認・コピーすることは可能です)。

サービスアカウントにプロジェクトへの付与する権限を指定することができます。今回は「続行」ボタンを押します。

サービスアカウントへアクセスを許可するユーザーを指定することができます。今回は「完了」ボタンを押します。

一覧に戻りますと、サービスアカウントが作成され、完了となります。

メールアドレスをコピーし忘れた場合はここでコピーするか、「メール」列のリンクを押すと詳細画面が表示されますので、そちらでもコピーすることができます。

認証情報をダウンロード

作成したサービスアカウントの詳細画面を開き、「キー」タブを押します。

「鍵を追加」ボタンを押して、表示されたドロップダウンメニューから「新しい鍵を作成」メニューを押します。

「キーのタイプ」項目の選択肢から「JSON」を選択し、「作成」ボタンを押します。

作成されるとダウンロードが自動的に行われます。完了しますと、「秘密鍵がパソコンに保存されました」と表示されますので、「閉じる」ボタンを押します。

ライブラリのインストール

google-cloud-speechというPythonのライブラリを、次のコマンドを入力し実行してインストールします。

pip install google-cloud-speech

ライブラリについては次の公式ページをご覧ください。Speech-to-Text クライアント ライブラリ

試してみる

各ライブラリを読み込みます。

import os, io
from google.cloud import speech

ダウンロードしたサービスアカウントの認証情報のファイルパスを、環境変数に設定します。

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './data/xxx.json'

クライアントのインスタンスを生成します。

client = speech.SpeechClient()

音声ファイルを読み込んで音声データを取得します。

with io.open('./media/audio.wav', 'rb') as f:
    content = f.read()

エンコードする音声データを設定します。

audio = speech.RecognitionAudio(content=content)

音声を処理する方法を設定します。

config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    enable_automatic_punctuation=True,
    audio_channel_count=2,
    language_code='ja-JP'
)

指定されている引数は次のような内容です。

引数説明
encoding enum 音声のコーデックを指定します。音声ファイルがサポートされているコーデックでないとエラーとなります。詳しくは次のページをご覧ください。AudioEncoding(英語サイト)
enable_automatic_punctuation 句読点を付けるかどうかを指定します。日本語の場合、音声の途中の句読点がうまくつかないことが多いです。
audio_channel_count integer 音声のチャンネル数を指定します。
language_code string 音声が何の言語であるかを指定します。詳しくは次のページをご覧ください。言語サポート

speech.RecognitionConfigメソッドの詳しい指定方法は次のページをご覧ください。

AudioEncoding(英語サイト)

client.recognizeメソッドで音声から文字への抽出の実行します。

response = client.recognize(request={
    'config': config,
    'audio': audio
})

ちなみに音声が60秒を超える場合は、client.long_running_recognizeメソッドを使用します。

response = client.long_running_recognize(request={
    'config': config,
    'audio': audio
})

抽出した結果を出力します。

for result in response.results:
    print(result.alternatives[0].transcript)

response.resultsに抽出した文字を音声の区切りごとのデータを返します。抽出した文字はそのうちのalternativesプロパティに格納されていて、文章の区切りごとに格納されます。さらにtranscriptプロパティが抽出した文字、confidenceプロパティが文字の信頼度として返します。

response.resultsについて詳しく知りたい方は次のページをご覧ください。Response body(英語サイト)

これをtest.pyとして保存して実行すると、例えば音声が「これはテストです」としゃべっていた場合、次のように出力されます。

以上で音声ファイルから文字を抽出することができました。これらのコードをまとめると次のようになります。

# ライブラリの読み込み
import os, io
from google.cloud import speech

# 認証情報のファイルパスを環境変数に設定
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'xxx.json'

# クライアントのインスタンスを生成
client = speech.SpeechClient()

# 音声ファイルを読み込む
with io.open('./media/audio.wav', 'rb') as f:
    content = f.read()

# エンコードする音声データを設定
audio = speech.RecognitionAudio(content=content)

# 音声を処理する方法の設定
config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    enable_automatic_punctuation=True,
    audio_channel_count=2,
    language_code='ja-JP'
)

# 抽出の実行
response = client.recognize(request={
    'config': config,
    'audio': audio
})

# 実行結果
for result in response.results:
    print(result.alternatives[0].transcript)

なお、Pythonのライブラリの詳しい使い方については、次の公式ドキュメントページをご覧ください。

https://cloud.google.com/python/docs/reference/speech/latest