You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何减少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:02:06