如何基于Pyannote分箱结果用OpenAI Whisper将印地语音频转写为英文?
解决方案
要实现印地语音频的英文转写(转录+翻译),只需利用Whisper内置的翻译功能,修改以下核心逻辑即可:
- 在调用
model.transcribe()时添加task="translate"参数,让模型直接将印地语内容翻译成英文输出。 - 保留
language="hi"参数可帮助模型精准识别输入语言,进一步提升翻译准确性。
修改后的完整代码
import whisper from pydub import AudioSegment from pyannote.database.util import load_rttm import os # 加载Whisper模型(确保模型已缓存) model = whisper.load_model("base") # 提取音频片段并完成转录翻译的函数 def transcribe_segment(audio_path, start_time, end_time, model): audio = AudioSegment.from_wav(audio_path) segment = audio[start_time * 1000:end_time * 1000] segment.export("temp_segment.wav", format="wav") # 关键修改:添加task="translate"实现直接翻译为英文 result = model.transcribe("temp_segment.wav", language="hi", task="translate") os.remove("temp_segment.wav") # 转录完成后删除临时文件 return result["text"] # 加载RTTM文件中的说话人分箱结果 rttm_file = "audio1.rttm" rttm_data = load_rttm(rttm_file) diarization = rttm_data[next(iter(rttm_data))] # 假设RTTM中仅对应一个音频文件 # 准备输出格式 audio_path = "hindi_audio.wav" output = [] # 处理每个音频片段并完成转录翻译 for segment, _, speaker in diarization.itertracks(yield_label=True): start_time = segment.start end_time = segment.end transcript = transcribe_segment(audio_path, start_time, end_time, model) output.append({ "speaker": speaker, "transcript": transcript, "start_time": start_time, "end_time": end_time }) # 打印结果 for entry in output: print(f"Speaker {entry['speaker']}: {entry['transcript']}") print(f"Start time: {entry['start_time']}") print(f"End time: {entry['end_time']}") print()
额外优化建议
若想避免生成临时文件,可直接将音频片段转换为Whisper支持的numpy数组格式,提升运行效率:
import numpy as np def transcribe_segment(audio_path, start_time, end_time, model): audio = AudioSegment.from_wav(audio_path) segment = audio[start_time * 1000:end_time * 1000] # 直接转换为numpy数组,跳过临时文件步骤 samples = np.array(segment.get_array_of_samples()) audio_np = samples.astype(np.float32) / 32768.0 # 转换为Whisper要求的格式 result = model.transcribe(audio_np, language="hi", task="translate") return result["text"]
内容的提问来源于stack exchange,提问作者Chaitanya Kale
相关产品推荐
相关产品推荐

