GoogleCloudのSpeech-to-Textを動かしてみる

:::note warn
この記事は2024年6月7日に弊社ブログにて公開されたものを移植したものです。
古い情報が含まれている可能性がありますのでご注意ください。
:::
本記事ではGoogle Cloud のSpeech-to-Textを、GoogleColaboratoryで実行します。基本動作をさせた後、モデル適応機能も使ってみます。Speech-to-TextのAPIをPythonで叩いてみたい方や、追加機能を試したい方は是非ご覧ください。

## Speech-to-Textを始める前に
Google CloudのSpeech-to-Textを利用するにはGoogleアカウントが必要です。また新規でSpeech-to-Text V1 APIを利用する際、[無料クレジット $300 分と 1 か月あたり 60 分間まで](https://cloud.google.com/speech-to-text/?utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-BKWS-all-pkws-trial-PHR-dr-1605216&utm_content=text-ad-none-none-DEV_c-CRE_670533043636-ADGP_Hybrid+%7C+BKWS+-+BRO+%7C+Txt+-AI+%26+ML-Speech+to+Text-google+cloud+speech+to+text-main-EN-KWID_43700077631745743-kwd-454490849660&userloc_1009549-network_g&utm_term=KW_google+cloud+speech+to+text&gad_source=1&gclid=CjwKCAjwvIWzBhAlEiwAHHWgvb2Rw3WBTrYMQo5brdFzUFtP5dDqdsK1EJ9DIrfzhDdCj4u-muVnyBoCjKoQAvD_BwE&gclsrc=aw.ds&hl=ja#pricing)音声の文字変換と分析が無料となっています。
利用枠を使い切っている場合は、料金がかかってきますのでご注意ください。Speech-to-Textの料金は[こちら](https://cloud.google.com/speech-to-text/pricing?_gl=1*uk1zku*_up*MQ..&gclid=CjwKCAjwvIWzBhAlEiwAHHWgvb2Rw3WBTrYMQo5brdFzUFtP5dDqdsK1EJ9DIrfzhDdCj4u-muVnyBoCjKoQAvD_BwE&gclsrc=aw.ds&hl=ja)こちらからご確認ください。

## Speech-to-Textの設定
GoogleColaboratoryで動かす前に、Speech-to-Textを利用できるように準備します。公式のHow To動画もあるので、こちらもプロジェクトの設定の際に参考にしてみてください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/SPcFViKU_xU?si=0GJkLFSEhPwGQ4j7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

1. Google Cloudプロジェクト作成を作成する
1. Cloud Speech-to-Text APIを有効にする
1. 作成したプロジェクトのコンソールを開く
1. API とサービスを開く
1. 認証情報を開く
1. 認証情報を作成し、サービスアカウントを選択
1. サービス アカウントの詳細を入力
1. 作成したアカウントを選択
1. キーを選択、鍵を追加、新しい鍵の作成を選択
1. キーのタイプをJSONにし作成、JSONファイルをダウンロード

## 音声認識の実行手順
ノートブックを新規作成を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/437d2e2a-94ee-c6bc-137c-f6cf62eb2e49.png)
上のメニューから 編集＞ノートブックの設定 を選択します。
ハードウェア アクセラレータをGPUに変更し、保存を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/b9510eed-c031-24db-92a5-581272e2fe22.png)
GoogleColaboratoryのセッションストレージに音声ファイルとJSONファイル配置していきます。
左のバーのファイルをクリックし、開いた箇所(下記画像の赤枠部分)へ音声認識させたい音声ファイルをドラック＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/b967c2d1-5628-6ae5-a4d2-5dfe4f89a9a3.png)
GoogleColaboratoryに必要事項を書いていきます。
まずライブラリをインストールします。
```
!pip install --upgrade google-cloud-speech
```

コードは公式のgitに掲載されている[Quick Start](https://github.com/awslabs/amazon-transcribe-streaming-sdk?tab=readme-ov-file#quick-start)をベースに、一部変更して利用します。アクセスキー、シークレットアクセスキー、音声ファイルのパスは各自のものに書き換えてください。
```python
import os
import wave
import io
from google.cloud import speech

voice_file_path = '音声ファイルパス'
api_key_path = 'キーのファイルパス'
fr = 24000

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = api_key_path

# サンプリングレートを確認
with wave.open(voice_file_path, 'rb') as f:
    fr = f.getframerate()

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

# 音声データを設定
audio = speech.RecognitionAudio(content=content)

config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=fr,
    language_code='ja-JP',
    )

# Speech-to-Text API クライアントを作成
client = speech.SpeechClient()

# 音声認識を実行
response = client.recognize(config=config, audio=audio)

# 結果を出力
for result in response.results:
    print(result.alternatives[0].transcript)
```
実行してみます。今回自分で用意した音声は『本日の東京の天気は晴れ。明日の大阪の天気は曇りです。』という音声なのでどのような結果が出るでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/d83a298a-9283-ef14-157f-64adc79132ae.png)
無事音声が認識されました、認識内容も問題ありません。

## 句読点機能を使う

enable_automatic_punctuationの項目をTrueに設定すると句読点の自動挿入を有効にすることができます。実際にやってみましょう。
```python
config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=fr,
    language_code='ja-JP',
    enable_automatic_punctuation=True,  # 句読点の自動挿入を有効にする
    }])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/472c57c6-cb70-a89c-f63f-2c317e15d7f1.png)
実行結果です、句読点が入り読みやすくなりました。

## モデル適応機能を使う
Cloud Speech-to-Textにはモデル適応機能があります。
モデル適応機能を使用すると、提案される可能性がある他の候補よりも、Speech-to-Text が特定の単語やフレーズをより高い頻度で認識するように設定できます。たとえば、音声データに「weather」という単語が含まれているとします。Speech-to-Text が「weather」という単語を検出した場合、「whether」よりも多く「weather」と文字変換されることが理想的です。この場合は、モデル適応を使用して「weather」と認識するように Speech-to-Text にバイアスをかけることができます。
## モデル適応により音声文字変換の結果を改善する
モデル適応を実感するために用意した音声は『えいせいのかんきょうはもんだいありません』という音声です。とりあえず何も設定せずに音声認識し、何と認識されるか確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/e44f5872-78a3-b8c0-4c05-276d9fb1cd5f.png)
何も設定していないと今回の『えいせい』は『衛星』と認識されました。ではモデル適応機能を利用し『えいせい』を『衛生』と認識してもらうようにしましょう。speech_contextsにphrasesとboostを設定します。
```python
config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=fr,
    language_code='ja-JP',
    # enable_automatic_punctuation=True,  # 句読点の自動挿入を有効にする
    # スピーチアダプテーションを追加
    speech_contexts=[{
        'phrases': ['衛生'],  # 認識を強化したい単語やフレーズ
        'boost': 10.0  # ブーストの度合い（1.0から20.0の範囲で指定）
    }])
```
設定し終えたので実行しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904804/51fdecb3-6c61-b33d-cbf3-f3052f5da4dd.png)
無事に『えいせい』を『衛生』と認識してもらうことができました。

## 終わりに
本記事では、Google CloudのSpeech-to-Textを利用して、Google Colaboratory上で実行する方法について説明しました。またモデル適応機能の利用で、特定の単語やフレーズをより正確に認識しやすくなること可能となり、音声認識技術の応用範囲が広がることをお見せすることができたと思います。