Pythonでマイク入力音声をテキストに変換する方法:SpeechRecognitionを使った音声認識と文字起こし

今回は、AmazonAlexaやGoogleアシスタントなどに興味があって前からやってみたかったのですが、Pythonでマイクから入力した音声をテキストにおとしすることにトライしてみましたので、記事にします。

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

入力音声をテキスト化するためにまずはライブラリのインストールから行っていきます。
今回インストールするライブラリはSpeechRecognistionというものを使用します。

いつもどおりpipコマンドを使用してインストールしていきます。
コマンドプロンプトを起動し、以下の通り入力してください。

pip install SpeechRecognistion

以下のように、Successfully installed SpeechRecognition-XXXXと出ればインストール完了です。

オフライン環境でインストールしたい場合は以下から、whlファイルをダウンロードしてSpeechRecognitionの代わりにファイルを指定してインストールしてください。

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

サンプルコード

では、まず、コード全体をどうぞ。

import sys
import os
import pyaudio
import wave 
import time
import threading
from logging import NullHandler
import speech_recognition

record_filepath = "D:\\Pythonテスト\\SpeechRecognition\\rec.wav"
rectime = 5
wave_f = NullHandler
streamstop = False

def readaudio(filepath):
    global wave_f
    global streamstop
    # Audio インスタンス取得
    audio = pyaudio.PyAudio() 
    stream = audio.open( format = pyaudio.paInt16,
                        rate = 44100,
                        channels = 1, 
                        input_device_index = 1,
                        input = True, 
                        frames_per_buffer = 4096,
                    )
    wave_f = wave.open(filepath, 'wb')
    wave_f.setnchannels(1)
    wave_f.setsampwidth(2)
    wave_f.setframerate(44100 )
    
    while True:
        if streamstop == False:
            data = stream.read(4096)
            rec_exec(data)
        else:
            break
          
    # 音声を読み出し    
    wave_f.close()
    # Audio デバイスの解放
    stream.stop_stream()
    stream.close()
    audio.terminate()

def main_func():
    global streamstop
    print(record_filepath)
    thread1 = threading.Thread(target=readaudio, args=(record_filepath,))
    thread1.start()
    
    count = 0
    while True:
        try:
            time.sleep(1)
            count += 1
            if count >= rectime:
                streamstop = True
                break
                
        except KeyboardInterrupt:
            streamstop = True
            break
    
    thread1.join()
           
    # ここから認識
    print("######Start Speech Recognition######")
    sprec = speech_recognition.Recognizer()  # インスタンスを生成
    with speech_recognition.AudioFile(record_filepath) as sprec_file:
        sprec_audio = sprec.record(sprec_file)
        sprec_text = sprec.recognize_google(sprec_audio, language='ja-JP')
        print(sprec_text)
    print("######Finish Speech Recognition######")
    os.remove(record_filepath)

def rec_exec(data):
    global wave_f
    #print(data)
    wave_f.writeframes( (data) )


if __name__ == '__main__':
    main_func()

プログラム全容

まずは、このコードで何をしているかを解説します。

今回使用するライブラリは、Wavファイルを渡す必要があるようでしたので、まず音声の録音を行います。

「D:\Pythonテスト\SpeechRecognition」というフォルダに、”rec.wav”というファイルに、rectime秒間(今回は5秒間)音声を録音します。
※何かキーを入力すると、5秒待たずに終了します。
続いて今回の本題となるSpeechRecognitionに録音したデータを引き渡しし、テキストに変換しています。
テキストを出力した後は作成した音声データを破棄して終了します。

プログラムの実行結果は以下の通りで、私がテストで話した内容がしっかりテキストとして出力されています。

続いてはプログラムの解説ですが、解説は次ページにて記載します。

プログラム解説

まずは、マイク音声の録音ですが、マイク音声の入力については以下にて紹介していますので、そちらを参照ください。

ではここから本題の認識部分で、全体としては以下の数行で行います。

import speech_recognition

    print("######Start Speech Recognition######")
    sprec = speech_recognition.Recognizer()  # インスタンスを生成
    with speech_recognition.AudioFile(record_filepath) as sprec_file:
        sprec_audio = sprec.record(sprec_file)
        sprec_text = sprec.recognize_google(sprec_audio, language='ja-JP')
        print(sprec_text)
    print("######Finish Speech Recognition######")

まずは、speech_recognition.Recognizerでインスタンスを生成します。
そのあとはspeech_recognition.AudioFile(ファイル)

ファイルが取得できたら、sprec.record( 取得したファイル )でデータの読み出し
最後に、sprec.recognize_google(オーディオデータ、言語)でテキストに変換
※language=’ja-JP’で日本語であることを指定

まとめ

すごく興味があって、このプログラムに挑戦してみましたが、簡単すぎてちょっと拍子抜けしてしましました。
まぁ、実際にはsprec.recognize_googleの中で、インターネット経由でgoogleを呼び出ししたりしているのだと思いますが、ユーザーはたった数行で変換できてとても便利ですね。

これをうまく活用していけば、それこそスマートスピーカーや家電を作っていけるのでしょうね。

ではまた、機会があれば何かやってみることにします。

リアルタイムでの文字起こしの方法が知りたいって方は、以下に記事記載しましたので見てみてください。

Pythonの基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!!