自分用知識置き場

気まぐれで更新します。間違ってたらご指摘お願いします。

Pythonとwhisperを使ってマイク入力による文字起こしをする(CPU)

whisperは、OpenAIが公開したオープンソースの素晴らしい音声認識モデルです。
これを使用することにより、ローカル環境で高精度な音声認識を行えます。
今回は、マイク入力でム文字起こしをしてみました。


この記事を参考にして動かしました。
詳しいことはこの記事を見てください。
nikkie-ftnext.hatenablog.com

zenn.dev


仕組み

マイク入力
  
「Speech Recognition」で音声データ作成
  
「SoundFile」で音声データの読み込み
  
「whisper」で文字起こし


マイク入力には、「Speech Recognition」と呼ばれるPythonのライブラリを使用する。
「Speech Recognition」を使用すると、音の波形が小さくなったところで音声ファイルを切ってくれる。
また、「Speech Recognition」の依存関係である「PyAudio」が2022年12月26日に新しいバージョン(0.2.13)を出したためPython3.8以上でも使えるようになりました。(やったー)

続いて「SoundFile」で音声データの読み込み、「whisper」で文字起こしを行う。

環境

・Ubuntu20.04
・Python3.8.10
Intel CPU

必要なものをインストール

whisperをインストール

以下のコマンドでwhisperをインストールする。

pip install git+https://github.com/openai/whisper.git

依存関係のffmpegをインストールする。
(無くても動く場合もある)

pip install ffmpeg-python
Speech Recognitionをインストール
pip install SpeechRecognition

依存関係のPyAudioをインストールする。

sudo apt install python3-pyaudio
その他必要なものをインストール

SoundFile

pip install soundfile

numpy

pip install numpy

ソースコード

from io import BytesIO
import numpy as np
import soundfile as sf
import speech_recognition as sr
import whisper

if __name__ == "__main__":
    model = whisper.load_model("medium")

    recognizer = sr.Recognizer()
    while True:
        # マイクから音声を取得
        with sr.Microphone(sample_rate=16_000) as source:
            print("なにか話してください")
            audio = recognizer.listen(source)

        print("音声処理中 ...")
        # 音声データをWhisperの入力形式に変換
        wav_bytes = audio.get_wav_data()
        wav_stream = BytesIO(wav_bytes)
        audio_array, sampling_rate = sf.read(wav_stream)
        audio_fp32 = audio_array.astype(np.float32)

        result = model.transcribe(audio_fp32, fp16=False)
        print(result["text"])

whisperのモデルは、mediumが良さそうです。
whisperの出力はJSON形式であり、今回必要なものは認識した文字列です。
result["text"]と書くことで、認識した文字列だけを抽出することができます。