如何基于SpeechRecognition/PyAudio实现Python实时语音转文本?
实现实时逐词语音识别输出
要实现实时逐词输出而不是等待用户说完再一次性输出,核心思路是持续监听小段音频并增量识别,而非用r.listen()等待完整语音输入。下面是具体的实现方案和代码:
核心思路
- 先校准环境噪音,避免背景音干扰识别准确性
- 循环监听短时长的音频片段(比如1秒),高频获取语音内容
- 每次识别片段内容后,和之前的识别结果对比,提取新增的单词并即时输出
- 处理识别过程中的内容修正(比如之前识别的内容被更新),保证输出连贯性
完整代码示例
import speech_recognition as sr def real_time_word_recognition(): r = sr.Recognizer() microphone = sr.Microphone(device_index=0) # 先校准环境噪音,只需要执行一次 with microphone as source: r.adjust_for_ambient_noise(source, duration=1) print("🎙️ 开始实时识别,按Ctrl+C停止...") previous_text = "" try: while True: with microphone as source: # 每次监听1秒的音频片段,phrase_time_limit控制单次监听时长 audio = r.listen(source, phrase_time_limit=1) try: # 调用Google语音识别API处理当前音频片段 current_text = r.recognize_google(audio) # 对比新旧识别结果,输出新增内容 if current_text.startswith(previous_text): # 如果当前结果是之前内容的延续,提取新增单词 new_content = current_text[len(previous_text):].strip() if new_content: print(new_content, end=" ", flush=True) previous_text = current_text else: # 如果识别结果有修正(比如之前识别错误),更新并重新输出当前完整内容 print(f"\r{current_text}", end=" ", flush=True) previous_text = current_text except sr.UnknownValueError: # 没识别到有效内容,直接跳过 continue except sr.RequestError as e: print(f"\n❌ Google识别服务请求失败: {e}") break except KeyboardInterrupt: print("\n🛑 识别已停止") if __name__ == "__main__": real_time_word_recognition()
关键细节说明
phrase_time_limit=1:这个参数控制单次监听的最长时长,设置为1秒可以保证我们频繁获取音频片段,实现"实时"效果。你可以根据需求调整(比如0.5秒更灵敏,但识别错误率可能上升)flush=True:强制控制台立刻输出内容,避免因系统缓冲导致的输出延迟- 文本对比逻辑:用前缀匹配判断是否是内容延续,避免重复输出已识别的单词;如果识别结果有修正,则更新并重新输出当前完整内容,保证准确性
- 异常处理:捕获
UnknownValueError(无有效识别内容)和RequestError(API请求失败),让程序运行更稳定
进阶优化建议
- 若需要更高的准确性和精准逐词检测,可以使用Google Cloud Speech-to-Text的流式识别API(当前代码用的是非流式API),它支持实时流式传输音频并返回逐词结果
- 可以引入分词库(比如
nltk)优化文本对比逻辑,将文本拆分为单词列表后对比差异,比字符串前缀匹配更可靠 - 可添加音量检测,仅当检测到用户说话时才触发识别,减少无效的监听和API请求
内容的提问来源于stack exchange,提问作者Darcy Owens
相关产品推荐
相关产品推荐

