PC 音频实时语音识别

问题描述 投票:0回答:1

我正在尝试制作实时语音识别软件,该软件将在屏幕上显示文本(使用 tkinter)。我已经找到了一种使用虚拟电缆音频、pyaudio 和语音识别库从 PC 输出获取音频的方法。不过我觉得我做错了什么,当然AI并不完美,但在6秒内批量发送语音会导致AI对语音的错误理解。您认为有更好的方法吗?我还可以使用不同的 API 进行语音识别。

import time
import tkinter as tk
import speech_recognition as sr

from app.ui.window import Window
import wave

import pyaudiowpatch as pyaudio

if __name__ == "__main__":
    recognizer = sr.Recognizer()

    p = pyaudio.PyAudio()
    device = p.get_default_input_device_info()

    sample_rate = int(device["defaultSampleRate"])

    duration_seconds = 6  # Duration to capture
    total_frames = sample_rate * duration_seconds

    buffer_size = 1024  # Size of each read
    frames = []
    overlap_frames = int(sample_rate * 0.5)

    while True:
        try:
            with p.open(
                channels=device["maxInputChannels"],
                format=pyaudio.paInt16,
                rate=sample_rate,
                input=True,
                frames_per_buffer=buffer_size,
                input_device_index=device["index"],
            ) as stream:
                print("Capturing audio...")
                frames = [stream.read(buffer_size) for _ in range(total_frames // buffer_size)]
                combined_audio = b''.join(frames[-overlap_frames:] + frames)

                try:
                    recognized_text = recognizer.recognize_wit(
                        sr.AudioData(combined_audio, int(device["defaultSampleRate"]), 2),
                        key="API_KEY"
                    )
                except Exception as e:
                    print(e)
                    continue

                frames = []

                print(f"Recognized: {recognized_text}")
        except Exception as e:
            print(f"Error: {e}")
            p.terminate()

    # root = tk.Tk()
    # app = Window(root)
    # root.mainloop()

python artificial-intelligence speech-recognition pyaudio
1个回答
1
投票

如果您只是在随机位置将音频切成 6 秒的片段,那么您最终会在块中得到部分单词。识别器将无法处理这个问题。

Python

speech_recognition
麦克风示例 使用
recognizer.listen()
,它通过监控音频音量来检测语音间隙。对于连续录音,您可以使用
recognizer.listen_in_background()
,它会在每次语音出现间隙时调用一个函数。间隙阈值可以作为类实例的字段进行调整(请参阅默认值)。

这将提供近乎实时的响应,只要您停止说话一会儿,它就会执行识别。

如果您需要更频繁地更新,最好的方法是对自上一个间隙以来捕获的整个音频块进行识别。然后,您可以在有新信息可用时更新已识别的文本。下一个单词通常会影响之前单词的概率估计。

© www.soinside.com 2019 - 2024. All rights reserved.