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

如何让Whisper仅使用最后30秒音频片段进行语言分配?

基于Whisper实现仅用最后30秒音频完成语言分配的解决方案

方案1:预处理截取最后30秒音频再转录

直接用音频工具把原音频的最后30秒截出来,再传给Whisper的transcribe()方法——因为Whisper默认用传入音频的前30秒做语言检测,这样截取后就相当于用原音频的最后30秒完成语言分配了。

  • 用命令行工具ffmpeg的话,执行:
    ffmpeg -i input.mp3 -ss $(($(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp3 | cut -d. -f1)-30)) -t 30 last_30s.mp3
    
  • 用Python的librosa库处理:
    import librosa
    import soundfile as sf
    
    audio_path = "input.mp3"
    y, sr = librosa.load(audio_path, sr=None)
    # 计算最后30秒的起始采样点,不足30秒就取全部
    start_sample = max(len(y) - int(30 * sr), 0)
    y_last_30s = y[start_sample:]
    sf.write("last_30s.mp3", y_last_30s, sr)
    
  • 之后调用model.transcribe("last_30s.mp3")即可,语言检测会基于这个截取后的片段。

方案2:修改Whisper源码逻辑

找到Whisper中负责提取语言检测片段的代码,把默认取前30秒的逻辑改成取最后30秒:

  • 定位到whisper/transcribe.py里的语言检测相关代码,原代码大概是截取音频的前30秒片段用于检测,比如:
    segment = audio[:30 * sample_rate]
    
  • 把这段改成:
    # 取最后30秒,音频不足30秒就用全部
    segment = audio[-30 * sample_rate:] if len(audio) >= 30 * sample_rate else audio
    
  • 保存修改后,调用transcribe()时就会自动用最后30秒做语言分配了。

方案3:手动调用语言检测模块再传入结果

先单独提取音频最后30秒,用Whisper的语言检测接口得到结果,再把结果传给transcribe()的language参数,跳过自动检测:

import whisper

model = whisper.load_model("base")
# 加载原音频
audio = whisper.load_audio("input.mp3")
sample_rate = whisper.audio.SAMPLE_RATE
last_30s_samples = 30 * sample_rate
# 截取最后30秒的音频数据
start_sample = max(len(audio) - last_30s_samples, 0)
audio_last_30s = audio[start_sample:]

# 手动检测语言
_, lang_probs = model.detect_language(audio_last_30s)
detected_language = max(lang_probs, key=lang_probs.get)

# 传入检测到的语言进行转录,此时不会再用前30秒检测语言
result = model.transcribe("input.mp3", language=detected_language)

内容的提问来源于stack exchange,提问作者bonchardon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:00:17