我正在尝试制作实时语音识别软件,该软件将在屏幕上显示文本(使用 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()
如果您只是在随机位置将音频切成 6 秒的片段,那么您最终会在块中得到部分单词。识别器将无法处理这个问题。
Python
speech_recognition
库麦克风示例 使用 recognizer.listen()
,它通过监控音频音量来检测语音间隙。对于连续录音,您可以使用 recognizer.listen_in_background()
,它会在每次语音出现间隙时调用一个函数。间隙阈值可以作为类实例的字段进行调整(请参阅默认值)。
这将提供近乎实时的响应,只要您停止说话一会儿,它就会执行识别。
如果您需要更频繁地更新,最好的方法是对自上一个间隙以来捕获的整个音频块进行识别。然后,您可以在有新信息可用时更新已识别的文本。下一个单词通常会影响之前单词的概率估计。