如何让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
相关产品推荐
相关产品推荐

