はじめに
やらなければいけないことは手短に nikkieです🍨
この記事は、アイうた円盤発売アドベントカレンダー 4日目の記事です。
昨日はnikkieさんによる『サトミの"防御力"🛡で語る #アイの歌声を聴かせて』でした。
防御力高いガールのサトミ、かわいいですよね(7/27まで冒頭17分公開されているから、みんな見て!!)
さて、今回は(別の記事で触れたこともあるのですが)、音声をプログラムに認識してもらう簡単な方法を取り上げます。
「アイうたのシオンみたいなプログラムが作れないかな」と考えるようになった後、最初に試した実装です。
‖◤#アイうた プロフィール帳①◢‖
— 映画『アイの歌声を聴かせて』Blu-ray & DVD 7.27 on sale!! (@ainouta_movie) 2021年9月23日
トップバッターは
”試験中のポンコツAI” シオン🔌🎶
特技の歌でサトミたちを振り回す…!?
シオンを演じた #土屋太鳳 さんが歌うミュージカルシーンもお楽しみに🎤#アイの歌声を聴かせて
🎬10.29 ROADSHOW pic.twitter.com/tD31PaR4sy
目次
プログラムに聞き取ってもらいたい!
本記事は、アドベントカレンダー2日目の記事と姉妹編の関係にあります。
『アイの歌声を聴かせて』のシオンのように会話させたいと思った経緯は2日目をお読みください。
シオンのようなプログラムとして、「人が喋った音声をプログラムで聞き取り、それを処理して、プログラムが応答を読み上げる」という実装を妄想しました。
これをすぐできる実装として試しています。
sayコマンドを実行するスクリプトに、音声を入力できるように機能追加して動かせました!
— nikkie にっきー シオンv0.0.1開発中⚒ (@ftnext) 2022年1月9日
入力されたテキストをそのまま返す実装なので、「こんにちは」って言ったら「こんにちは」って言います。
動いた瞬間はプログラミングやってて今までで一番嬉しかったかもしれません #アイの歌声を聴かせて https://t.co/BSLf3YrcoV
プログラムによる音声聞き取りは、音声認識(speech recognition)と呼ばれる技術に位置づけられます1。
音声認識はASR(automatic speech recognition)やSpeech-To-Textとも呼ばれます2。
Pythonプログラムで聞き取り
アイデアを手早く実装したかったので、音声認識のWeb API(Google 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 プロジェクトを設定する
- サービス アカウントを作成する
ライブラリ 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
動作確認した環境は以下です。
- macOS
- Python 3.9.4
- SpeechRecognition 3.8.1
- PyAudio 0.2.11
- google-cloud-speech 2.14.1
- google-api-python-client 2.52.0
- oauth2client 4.1.3
以下はオプショナルです。
- 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の利用には通信が必須ですが、シオンはスタンドアローンなので通信できません。
そこで、機械学習モデルを使った実装に置き換えました。
音声認識については必要に応じて以下の本に当たっています。
-
「音声信号から発話内容を認識する技術のことを、音声認識技術と呼びます」 ref:『Pythonで学ぶ音声認識』p.10↩
-
「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については引用者が補足)↩
-
「5.プロジェクトに関連付けずに Speech-to-Text を試すには、[この API を試す] オプションを選択します。」とあるので、もしかすると「プロジェクト作成」「請求先アカウントを関連付ける」は不要なのかもしれません(未検証です)↩
-
「required only if you need to use microphone input」 https://github.com/Uberi/speech_recognition#requirements↩
-
https://github.com/Uberi/speech_recognition#google-cloud-speech-library-for-python-for-google-cloud-speech-api-users↩
-
https://github.com/Uberi/speech_recognition#requirements にも挙がっています↩
-
https://github.com/Uberi/speech_recognition/issues/368#issuecomment-431350796↩
-
sounddeviceは読み上げで使いました ↩
-
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↩ -
「手早く」にこだわっているのは作ってみて「なんか違う」場合もあると思っていて、初手を小さくして学びを得たいからです。シオンを音声認識と読み上げで実現するのは手早く作ってしっくり来た(気持ちが盛り上がった)ので、機械学習モデルを使ってよりシオンに近づけました。アイうた関連で他にも手を動かしていますが、手早く作って方向転換した事例も実はあります。↩