nikkie-ftnextの日記

イベントレポートや読書メモを発信

「喋った内容をプログラムに認識してもらいたい!」というアイデアをPythonで手早く検証する

はじめに

やらなければいけないことは手短に nikkieです🍨

この記事は、アイうた円盤発売アドベントカレンダー 4日目の記事です。
昨日はnikkieさんによる『サトミの"防御力"🛡で語る #アイの歌声を聴かせて』でした。
防御力高いガールのサトミ、かわいいですよね(7/27まで冒頭17分公開されているから、みんな見て!!)

さて、今回は(別の記事で触れたこともあるのですが)、音声をプログラムに認識してもらう簡単な方法を取り上げます。
「アイうたのシオンみたいなプログラムが作れないかな」と考えるようになった後、最初に試した実装です。

目次

プログラムに聞き取ってもらいたい!

本記事は、アドベントカレンダー2日目の記事と姉妹編の関係にあります。
アイの歌声を聴かせて』のシオンのように会話させたいと思った経緯は2日目をお読みください。

シオンのようなプログラムとして、「人が喋った音声をプログラムで聞き取り、それを処理して、プログラムが応答を読み上げる」という実装を妄想しました。
これをすぐできる実装として試しています。

プログラムによる音声聞き取りは、音声認識(speech recognition)と呼ばれる技術に位置づけられます1
音声認識ASR(automatic speech recognition)やSpeech-To-Textとも呼ばれます2

Pythonプログラムで聞き取り

イデアを手早く実装したかったので、音声認識のWeb APIGoogle Cloud Speech-to-Text API)を使いました。
利用方法を調べる中で知ったライブラリSpeechRecognitionを使っています。

Google Cloud Speech-to-Text API

https://cloud.google.com/speech-to-text

Google Cloudのアカウントを持っていたので、Google Cloudの音声認識Web APIを選択しました。
使い始めるに当たり、ドキュメントを参照して以下2点を実施しました。

  • Google Cloud プロジェクトを設定する
    1. プロジェクト作成
    2. 請求先アカウントを関連付ける
      • 注にありますが、「無料割り当てを超過しない限り、請求が発生することはありません。」
      • イデア検証の範囲では2桁回数程度しか送っていないため、無料で使えました
    3. Speech-to-Text API を有効にする3
  • サービス アカウントを作成する
    • サービス アカウントに JSON キーを作成し、JSONファイルをダウンロードしておきます

ライブラリ SpeechRecognition

Library for performing speech recognition, with support for several engines and APIs, online and offline.

意訳:音声認識のためのライブラリ。いくつかのエンジンやAPIをサポート。オンラインでもオフラインでも動作

サポートする音声認識Web APIとしては、Google Cloud Speech-to-Text APIの他に

が挙がっています。
また私は試せていませんが、オフラインで動作する音声認識エンジン(例:CMU Sphinx)もサポートしています。

環境構築

pip install SpeechRecognitionだけでは済まず、以下のインストールも必要でした。

  • pyaudio(マイクから入力するのに必要4
  • google-cloud-speech(Google Cloud Speech-to-Text APIを使うのに必要5
  • google-api-python-client(google-cloud-speechとは別に必要6
  • oauth2client7
pip install pyaudio google-cloud-speech google-api-python-client oauth2client
マイクから音声を取得

以下のコードで、PCのマイクに喋った音声をPythonで扱えるようにできます。

import speech_recognition as sr

r = sr.Recognizer()
with sr.Microphone(sample_rate=16_000) as source:
    print("なにか話してください")
    audio = r.listen(source)
    print("音声を取得しました")
脱線:取得した音声の確認

マイクから音が取得できていることの確認もできます。
追加で以下をインストールします8

pip install numpy sounddevice

上記のスクリプトpython -i example.pyのように実行したあと、以下のコードを打ちます。

>>> # python -i により、スクリプトを実行した後に対話モードに入ります
>>> import numpy as np
>>> import sounddevice as sd
>>> raw_audio = audio.get_raw_data()
>>> audio_array = np.frombuffer(raw_audio, dtype=np.int16)
>>> sd.play(audio_array, 16_000)  # 再生。Microphoneに指定したsample_rateと合わせています
音声をGoogle Cloud Speech-to-Text APIに送る

先ほどのスクリプトに、APIを呼び出すコードを追加します9

import speech_recognition as sr

# 以下の2行を追加
with open("サービスアカウントに作成したJSONキー(ダウンロード済み)の絶対パス") as f:
    credentials = f.read()  # JSONキーの文字列を読み取る

r = sr.Recognizer()
with sr.Microphone(sample_rate=16_000) as source:
    print("なにか話してください")
    audio = r.listen(source)
    print("音声を取得しました")

# 以下を追加
recognized_text = r.recognize_google_cloud(
    audio, credentials, language="ja-JP"
)
print(recognized_text.strip())

スクリプトを実行すると、喋った内容が文字列で表示されます!🙌

$ python example.py
なにか話してください
音声を取得しました
こんにちは

language="ja-JP"という言語の指定についてはこちら:
Language support  |  Cloud Speech-to-Text Documentation  |  Google Cloud

SpeechRecognitionのリファレンスを覗くとrecognize_google_cloud以外のメソッドもあり、他のWeb APIを試すことも簡単にできると思われます。
マイクの扱いはほぼ変わらず、recognize_google_cloudメソッドを変えるだけで他のAPIも試せるはず!

終わりに

人間と会話できるAI🤖シオンの一部をなすであろう(※妄想)、プログラムによる音声認識Pythonで手短に実現する方法を紹介しました。
音声認識Web APIをライブラリSpeechRecognitionから利用しています!

音声認識Web APIの裏には、クラウドベンダーが大量のデータから開発した機械学習モデルがあると思われます。
大量のデータを個人で用意するのは難しいですが、Web APIを介して機械学習の結果を利用できますね。
Web APIの利用はPython以外のプログラミング言語でも可能ですし、音声認識以外の機械学習の成果もWeb APIで提供されています。
音声認識のような機械学習が関連するアイデアを検証する上で、Web APIの利用は手早さという点で武器になるなと感じています。
「今後も『アニメで見たあれ作りたいなー』ってなったら、Web APIで手早く検証できないかまず考えていこう」と手応えを得ました!10

動作確認した環境は以下です。

以下はオプショナルです。

  • numpy 1.23.0
  • sounddevice 0.4.4
$ python example.py
なにか話してください
音声を取得しました
以上アイの歌声を聞かせて円盤発売 ADVENT Calendar 4日目の記事でした

(字は違いますが、)「アイの歌声を聞かせて」認識するなんて、Google Cloud Speech-to-Text API やるなー!

P.S. より本格的な実装へ

手早く実装してできあがったシオンに満足し、開発を続けています。
Google Cloud Speech-to-Text APIの利用には通信が必須ですが、シオンはスタンドアローンなので通信できません。
そこで、機械学習モデルを使った実装に置き換えました。

音声認識については必要に応じて以下の本に当たっています。


  1. 「音声信号から発話内容を認識する技術のことを、音声認識技術と呼びます」 ref:『Pythonで学ぶ音声認識』p.10

  2. 「It(=Speech recognition) is also known as automatic speech recognition (ASR), computer speech recognition or speech to text (STT). 」 https://en.wikipedia.org/wiki/Speech_recognition (2022/07/03 閲覧。Itについては引用者が補足)

  3. 「5.プロジェクトに関連付けずに Speech-to-Text を試すには、[この API を試す] オプションを選択します。」とあるので、もしかすると「プロジェクト作成」「請求先アカウントを関連付ける」は不要なのかもしれません(未検証です)

  4. 「required only if you need to use microphone input」 https://github.com/Uberi/speech_recognition#requirements

  5. https://github.com/Uberi/speech_recognition#google-cloud-speech-library-for-python-for-google-cloud-speech-api-users

  6. https://github.com/Uberi/speech_recognition#requirements にも挙がっています

  7. https://github.com/Uberi/speech_recognition/issues/368#issuecomment-431350796

  8. sounddeviceは読み上げで使いました

  9. recognize_google_cloudメソッドのリファレンス https://github.com/Uberi/speech_recognition/blob/3.8.1/reference/library-reference.rst#recognizer_instancerecognize_google_cloudaudio_data-audiodata-credentials_json-unionstr-none–none-language-str–en-us-preferred_phrases-unioniterablestr-none–none-show_all-bool–false—unionstr-dictstr-any

  10. 「手早く」にこだわっているのは作ってみて「なんか違う」場合もあると思っていて、初手を小さくして学びを得たいからです。シオンを音声認識と読み上げで実現するのは手早く作ってしっくり来た(気持ちが盛り上がった)ので、機械学習モデルを使ってよりシオンに近づけました。アイうた関連で他にも手を動かしていますが、手早く作って方向転換した事例も実はあります。