文字起こし

文字起こしのコードになります
マイクから音声を拾って、tkformにテキストにして表示する簡単なコード
```
pip list
pip install jupyterlab
pip install jupyterlab-language-pack-ja-jp

pip install sounddevice numpy SpeechRecognition
```

```mojiokoshi.py
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import sounddevice as sd
import numpy as np
import speech_recognition as sr
import threading
import queue

# 音声録音に関する設定
DURATION = 3  # 録音時間（秒）
SAMPLE_RATE = 16000  # サンプリングレート（1秒あたりのサンプル数）
CHANNELS = 1  # チャンネル数（モノラル）
DTYPE = 'int16'  # データ型（16bit整数）

sprec = sr.Recognizer()  # 音声認識器のインスタンスを生成

class SpeechRecognitionApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Speech Recognition App")  # ウィンドウタイトルを設定

        # スクロール可能なテキストエリアを作成
        self.text_box = ScrolledText(self.root, wrap=tk.WORD, width=50, height=20)
        self.text_box.pack(padx=10, pady=10)

        # 開始ボタン
        self.start_button = tk.Button(self.root, text="Start", command=self.start_recognition)
        self.start_button.pack(pady=5)

        # 停止ボタン（初期状態は無効）
        self.stop_button = tk.Button(self.root, text="Stop", command=self.stop_recognition, state=tk.DISABLED)
        self.stop_button.pack(pady=5)

        self.running = False  # 録音中かどうかのフラグ
        self.audio_queue = queue.Queue()  # 音声データを一時保存するキュー

    # 音声データが届いたときに呼ばれるコールバック関数
    def audio_callback(self, indata, frames, time_, status):
        if status:
            print("⚠️ Status:", status)
        self.audio_queue.put(indata.copy())  # 音声データをキューに格納

    # 音声を認識してテキストに変換
    def process_audio(self):
        while self.running:
            try:
                audio_chunk = self.audio_queue.get(timeout=1)  # キューから音声を取得
                audio_bytes = audio_chunk.tobytes()  # バイト列に変換
                audio_data = sr.AudioData(audio_bytes, SAMPLE_RATE, 2)  # speech_recognition 用データ作成
                try:
                    # Google音声認識で文字起こし（日本語）
                    text = sprec.recognize_google(audio_data, language='ja-JP')
                    self.text_box.insert(tk.END, text + "\n")
                    self.text_box.see(tk.END)
                except sr.UnknownValueError:
                    pass  # 音声を認識できなかった場合は無視
                except sr.RequestError as e:
                    self.text_box.insert(tk.END, f"API エラー: {e}\n")  # APIエラー表示
            except queue.Empty:
                continue

    # 音声認識を開始
    def start_recognition(self):
        self.running = True
        self.start_button.config(state=tk.DISABLED)
        self.stop_button.config(state=tk.NORMAL)

        # 入力ストリームを開始
        self.stream = sd.InputStream(
            samplerate=SAMPLE_RATE,
            channels=CHANNELS,
            dtype=DTYPE,
            callback=self.audio_callback,
            blocksize=int(SAMPLE_RATE * DURATION)
        )
        self.stream.start()

        # 音声処理用のスレッドを開始
        self.worker_thread = threading.Thread(target=self.process_audio)
        self.worker_thread.start()

    # 音声認識を停止
    def stop_recognition(self):
        self.running = False
        self.start_button.config(state=tk.NORMAL)
        self.stop_button.config(state=tk.DISABLED)

        if hasattr(self, 'stream'):
            self.stream.stop()
            self.stream.close()

# アプリを起動する関数
def main():
    root = tk.Tk()
    app = SpeechRecognitionApp(root)
    root.mainloop()

if __name__ == '__main__':
    main()
```

![スクリーンショット 2025-06-03 152211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/f2370528-68ba-4467-b111-5e2cee6c3157.png)