如何减少Python SpeechRecognition停止录音所需的静默时长
解决直播字幕生成中麦克风监听静默时长过长的问题
一、调整SpeechRecognition库的静默检测阈值
SpeechRecognition的Recognizer类自带pause_threshold属性,默认值为0.8秒——这就是它判定说话结束所需的静默时长。直接修改该值即可将等待时间缩短到0.5秒,完全不会像phrase_time_limit那样截断正在进行的语音。
核心代码修改
在初始化recognizer后添加一行设置:
recognizer = sr.Recognizer() # 设置静默0.5秒后结束监听 recognizer.pause_threshold = 0.5
如果需要加快环境噪声校准速度,还可以调整adjust_for_ambient_noise的duration参数(默认1秒):
with microphone as source: recognizer.adjust_for_ambient_noise(source, duration=0.5)
修改后的完整关键片段
无需改动原有的listen函数逻辑,仅调整recognizer属性即可:
def listen(recognizer, microphone): with microphone as source: audio = recognizer.listen(source) return audio if __name__ == "__main__": mic_index = get_mic() translator = Translator() recognizer = sr.Recognizer() # 关键设置:缩短静默检测时长 recognizer.pause_threshold = 0.5 microphone = sr.Microphone(device_index=mic_index) print("Adjusting for ambient noise, please don't say anything...") with microphone as source: recognizer.adjust_for_ambient_noise(source, duration=0.5) print("Listening...") # 后续线程逻辑保持不变
二、替代方案:使用OpenAI Whisper实现低延迟实时转录
如果SpeechRecognition的调整仍达不到需求,可以尝试OpenAI的Whisper库——它自带精准的语音活动检测(VAD),能更灵活地控制静默停止时机,且转录准确率更高。
步骤1:安装依赖
pip install openai-whisper sounddevice numpy
步骤2:实时转录示例代码
该示例会持续监听麦克风,检测到0.5秒静默时自动完成转录:
import whisper import sounddevice as sd import numpy as np from googletrans import Translator import threading # 配置 OUTPUT_FILE_NAME = "transcription.txt" SILENCE_THRESHOLD = 0.5 # 静默结束阈值(秒) SAMPLE_RATE = 16000 # Whisper要求的采样率 model = whisper.load_model("tiny") # 可选tiny/base/small等,tiny最快 translator = Translator() def write_to_file(file_path, text): with open(file_path, "w", encoding="utf-8") as file: file.write(text) def transcribe_audio(audio_data): audio = whisper.pad_or_trim(audio_data) result = model.transcribe(audio, language="uk") uk_text = result["text"] try: translated_text = translator.translate(uk_text, src="uk", dest="en") write_to_file(OUTPUT_FILE_NAME, translated_text.text) except Exception as e: print(f"Translation error: {e}") write_to_file(OUTPUT_FILE_NAME, uk_text) def listen_and_transcribe(): print("Listening...") audio_buffer = [] silence_start = None stream = sd.InputStream(samplerate=SAMPLE_RATE, channels=1, dtype=np.float32) with stream: while True: data, overflowed = stream.read(int(SAMPLE_RATE * 0.1)) # 每0.1秒读取一次音频 audio_buffer.append(data) # 通过RMS判断是否为静默(可根据环境调整0.001这个阈值) rms = np.sqrt(np.mean(data**2)) if rms < 0.001: if silence_start is None: silence_start = sd.get_stream_time() elif sd.get_stream_time() - silence_start >= SILENCE_THRESHOLD: if audio_buffer: full_audio = np.concatenate(audio_buffer) threading.Thread(target=transcribe_audio, args=(full_audio,), daemon=True).start() audio_buffer = [] silence_start = None else: silence_start = None if __name__ == "__main__": try: listen_and_transcribe() except KeyboardInterrupt: print("\nShutting down recognition service...") write_to_file(OUTPUT_FILE_NAME, "Recognition service inactive. This is sample text.")
此方案优势:
- 静默检测阈值完全自定义,灵活度更高
- 转录准确率远超Google Speech Recognition免费版
- 原生支持多语言,适配乌克兰语转英语需求
内容的提问来源于stack exchange,提问作者Collert
相关产品推荐
相关产品推荐

