如何在Python中调用Windows 10自带的Windows Speech Recognition并以.wav文件作为输入?
这个问题问得好!其实在Python里完全可以实现把WAV文件输入到Windows自带的语音识别功能中,下面给你两种实用的方案:
方案一:通过pywin32调用Windows SAPI(底层接口)
Windows Speech Recognition的底层是基于**SAPI(Speech API)**实现的,我们可以用pywin32库直接调用这套COM接口,实现WAV文件的语音识别。
步骤:
- 首先安装依赖库:
pip install pywin32
- 编写识别代码:
import win32com.client def recognize_wav_via_sapi(wav_file_path): # 初始化共享识别上下文 reco_context = win32com.client.Dispatch("SAPI.SpSharedRecoContext") # 启用听写模式(无需自定义语法) grammar = reco_context.CreateGrammar() grammar.DictationSetState(1) # 创建音频流并加载WAV文件 audio_stream = win32com.client.Dispatch("SAPI.SpFileStream") # 以只读模式打开音频文件 audio_stream.Open(wav_file_path, win32com.client.constants.SSFMOpenRead, False) # 设置识别器的输入音频流 reco_context.Recognizer.AudioInputStream = audio_stream # 定义识别结果回调函数 def on_recognition(event): if event.RecognitionStatus == 0: # 识别成功状态码 print(f"识别结果:{event.PhraseInfo.GetText()}") # 绑定识别事件 reco_context.Recognition += on_recognition # 启动识别(SER_DEFAULT表示同步等待识别完成) reco_context.Recognizer.Recognize(win32com.client.constants.SER_DEFAULT) # 清理资源 audio_stream.Close() # 调用示例 recognize_wav_via_sapi("your_audio.wav")
注意事项:
- 你的WAV文件必须是16kHz采样率、16位深度、单声道的PCM格式,如果不符合,建议用工具转换(比如FFmpeg命令):
ffmpeg -i input.wav -ar 16000 -ac 1 -sample_fmt s16 output.wav
方案二:使用SpeechRecognition库(简化封装)
如果你不想直接操作底层COM接口,可以用SpeechRecognition库——它已经封装了调用Windows原生识别引擎的接口,代码更简洁。
步骤:
- 安装依赖库:
pip install SpeechRecognition
- 编写识别代码:
import speech_recognition as sr def recognize_wav_via_sr(wav_file_path): recognizer = sr.Recognizer() # 读取WAV文件 with sr.AudioFile(wav_file_path) as source: audio_data = recognizer.record(source) try: # 调用Windows自带的语音识别引擎 result = recognizer.recognize_windows(audio_data) print(f"识别结果:{result}") except sr.UnknownValueError: print("Windows语音识别无法解析音频内容") except sr.RequestError as e: print(f"调用Windows语音识别服务失败:{e}") # 调用示例 recognize_wav_via_sr("your_audio.wav")
优势:
- 库会自动处理部分格式兼容问题,无需手动配置音频流参数
- 代码更简洁,适合快速开发需求
两种方案都是直接调用Windows系统原生的语音识别服务,和Unity中UnityEngine.Windows.Speech的底层逻辑一致,都是依托Windows的SAPI实现的。你可以根据自己对控制粒度的需求选择合适的方案。
内容的提问来源于stack exchange,提问作者Pedro Aires
相关产品推荐
相关产品推荐

