语音翻译 #

翻译基础 #

什么是语音翻译? #

语音翻译是将一种语言的音频直接转换为另一种语言的文本。Whisper 的翻译功能可以将 99 种语言的音频直接翻译成英文文本。

text
┌─────────────────────────────────────────────────────────────┐
│                    翻译流程                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  音频输入 → 语言识别 → 翻译推理 → 英文输出                   │
│                                                             │
│  输入: 中文音频 "你好,世界"                                 │
│  输出: 英文文本 "Hello, world"                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

转录 vs 翻译 #

text
转录(Transcribe):
├── 输入: 中文音频
├── 输出: 中文文本
└── 语言: 保持不变

翻译(Translate):
├── 输入: 中文音频
├── 输出: 英文文本
└── 语言: 转换为英文

基本用法 #

python
import whisper

model = whisper.load_model("base")

result = model.translate("chinese_audio.mp3")
print(result["text"])

或使用 transcribe 方法:

python
result = model.transcribe("chinese_audio.mp3", task="translate")
print(result["text"])

命令行翻译 #

基本翻译 #

bash
whisper audio.mp3 --task translate

指定源语言 #

bash
whisper chinese_audio.mp3 --task translate --language Chinese
whisper japanese_audio.mp3 --task translate --language Japanese
whisper french_audio.mp3 --task translate --language French

输出翻译结果 #

bash
whisper audio.mp3 --task translate --output_format srt
whisper audio.mp3 --task translate --output_format txt

支持的源语言 #

语言列表 #

Whisper 支持从以下语言翻译到英文:

python
import whisper

print("支持翻译的语言:")
for code, name in whisper.tokenizer.LANGUAGES.items():
    print(f"  {code}: {name}")

常用语言示例 #

源语言 代码 示例输入 示例输出
中文 zh 你好,世界 Hello, world
日语 ja こんにちは Hello
韩语 ko 안녕하세요 Hello
法语 fr Bonjour Hello
德语 de Guten Tag Good day
西班牙语 es Hola Hello
俄语 ru Привет Hello
阿拉伯语 ar مرحبا Hello

翻译示例 #

示例 1: 基本翻译 #

python
import whisper

model = whisper.load_model("base")

result = model.translate("speech_zh.mp3")
print(f"翻译结果: {result['text']}")
print(f"源语言: {result['language']}")

示例 2: 批量翻译 #

python
import whisper
import os

model = whisper.load_model("base")

audio_files = ["speech1.mp3", "speech2.mp3", "speech3.mp3"]

for audio_file in audio_files:
    result = model.translate(audio_file)
    print(f"\n{audio_file}:")
    print(f"源语言: {result['language']}")
    print(f"翻译: {result['text']}")

示例 3: 带时间戳的翻译 #

python
import whisper

model = whisper.load_model("base")
result = model.translate("speech.mp3")

print("带时间戳的翻译:")
for segment in result["segments"]:
    print(f"[{segment['start']:.1f}s - {segment['end']:.1f}s] {segment['text']}")

示例 4: 生成双语字幕 #

python
import whisper

model = whisper.load_model("base")

transcribe_result = model.transcribe("audio.mp3", language="zh")
translate_result = model.translate("audio.mp3")

def write_bilingual_srt(segments_zh, segments_en, output_path):
    with open(output_path, "w", encoding="utf-8") as f:
        for i, (zh, en) in enumerate(zip(segments_zh, segments_en), 1):
            start = format_timestamp(zh["start"])
            end = format_timestamp(zh["end"])
            
            f.write(f"{i}\n")
            f.write(f"{start} --> {end}\n")
            f.write(f"{zh['text'].strip()}\n")
            f.write(f"{en['text'].strip()}\n\n")

def format_timestamp(seconds):
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

write_bilingual_srt(
    transcribe_result["segments"],
    translate_result["segments"],
    "bilingual.srt"
)

提高翻译质量 #

使用更大的模型 #

python
import whisper

models = {
    "tiny": whisper.load_model("tiny"),
    "base": whisper.load_model("base"),
    "small": whisper.load_model("small"),
    "medium": whisper.load_model("medium"),
}

audio_file = "chinese_speech.mp3"

for name, model in models.items():
    result = model.translate(audio_file)
    print(f"{name}: {result['text']}")

指定源语言 #

python
import whisper

model = whisper.load_model("base")

result_auto = model.translate("audio.mp3")
print(f"自动检测: {result_auto['text']}")

result_specified = model.translate("audio.mp3", language="zh")
print(f"指定语言: {result_specified['text']}")

使用初始提示 #

python
import whisper

model = whisper.load_model("base")

result = model.translate(
    "technical_speech.mp3",
    initial_prompt="This is a technical presentation about machine learning and artificial intelligence."
)

print(result["text"])

调整温度参数 #

python
import whisper

model = whisper.load_model("base")

result = model.translate(
    "audio.mp3",
    temperature=0.0
)

print(f"翻译结果: {result['text']}")

翻译质量评估 #

对比原文和翻译 #

python
import whisper

model = whisper.load_model("base")

transcribe_result = model.transcribe("audio.mp3", language="zh")
translate_result = model.translate("audio.mp3")

print("原文(中文):")
print(transcribe_result["text"])
print("\n翻译(英文):")
print(translate_result["text"])

计算翻译置信度 #

python
import whisper

model = whisper.load_model("base")
result = model.translate("audio.mp3")

for segment in result["segments"]:
    avg_logprob = segment["avg_logprob"]
    confidence = 2 ** avg_logprob
    
    print(f"文本: {segment['text']}")
    print(f"置信度: {confidence:.2%}\n")

翻译限制 #

只能翻译到英文 #

text
限制:
├── 只能将其他语言翻译到英文
├── 不能将英文翻译到其他语言
├── 不能进行非英语语言之间的翻译
└── 这是 Whisper 的设计限制

替代方案:
├── 先转录,再用翻译模型翻译
├── 使用其他翻译服务
└── 结合机器翻译 API

解决方案:多步骤翻译 #

python
import whisper
from transformers import MarianMTModel, MarianTokenizer

whisper_model = whisper.load_model("base")

def translate_audio_to_target(audio_path, target_lang="fr"):
    result = whisper_model.translate(audio_path)
    english_text = result["text"]
    
    model_name = f"Helsinki-NLP/opus-mt-en-{target_lang}"
    tokenizer = MarianTokenizer.from_pretrained(model_name)
    mt_model = MarianMTModel.from_pretrained(model_name)
    
    inputs = tokenizer(english_text, return_tensors="pt", padding=True)
    translated = mt_model.generate(**inputs)
    target_text = tokenizer.decode(translated[0], skip_special_tokens=True)
    
    return {
        "original_language": result["language"],
        "english_translation": english_text,
        "target_language": target_lang,
        "target_translation": target_text
    }

result = translate_audio_to_target("chinese_audio.mp3", "fr")
print(f"源语言: {result['original_language']}")
print(f"英文翻译: {result['english_translation']}")
print(f"法语翻译: {result['target_translation']}")

实用场景 #

场景 1: 外语视频字幕 #

python
import whisper

model = whisper.load_model("base")

result = model.translate("foreign_video.mp3")

def write_srt(segments, output_path):
    with open(output_path, "w", encoding="utf-8") as f:
        for i, segment in enumerate(segments, 1):
            start = format_timestamp(segment["start"])
            end = format_timestamp(segment["end"])
            text = segment["text"].strip()
            
            f.write(f"{i}\n")
            f.write(f"{start} --> {end}\n")
            f.write(f"{text}\n\n")

write_srt(result["segments"], "english_subtitles.srt")

场景 2: 跨语言会议记录 #

python
import whisper

model = whisper.load_model("medium")

audio_files = {
    "chinese_speaker.mp3": "zh",
    "japanese_speaker.mp3": "ja",
    "french_speaker.mp3": "fr"
}

meeting_minutes = []

for audio_file, expected_lang in audio_files.items():
    result = model.translate(audio_file)
    
    meeting_minutes.append({
        "file": audio_file,
        "language": result["language"],
        "translation": result["text"]
    })

print("会议纪要(英文):")
for item in meeting_minutes:
    print(f"\n[{item['language'].upper()}] {item['file']}")
    print(item['translation'])

场景 3: 多语言内容分析 #

python
import whisper

model = whisper.load_model("base")

def analyze_multilingual_content(audio_path):
    result = model.translate(audio_path)
    
    return {
        "detected_language": result["language"],
        "english_translation": result["text"],
        "duration": result["segments"][-1]["end"] if result["segments"] else 0,
        "segment_count": len(result["segments"])
    }

analysis = analyze_multilingual_content("podcast.mp3")
print(f"检测语言: {analysis['detected_language']}")
print(f"时长: {analysis['duration']:.1f}秒")
print(f"翻译: {analysis['english_translation']}")

翻译 vs 转录对比 #

准确性对比 #

python
import whisper

model = whisper.load_model("base")

audio = "chinese_audio.mp3"

transcribe_result = model.transcribe(audio, language="zh")
translate_result = model.translate(audio)

print("转录(中文):")
for seg in transcribe_result["segments"]:
    print(f"  [{seg['avg_logprob']:.2f}] {seg['text']}")

print("\n翻译(英文):")
for seg in translate_result["segments"]:
    print(f"  [{seg['avg_logprob']:.2f}] {seg['text']}")

性能对比 #

python
import whisper
import time

model = whisper.load_model("base")
audio = "audio.mp3"

start = time.time()
transcribe_result = model.transcribe(audio)
transcribe_time = time.time() - start

start = time.time()
translate_result = model.translate(audio)
translate_time = time.time() - start

print(f"转录时间: {transcribe_time:.2f}s")
print(f"翻译时间: {translate_time:.2f}s")

最佳实践 #

1. 选择合适的模型 #

text
场景推荐:
├── 快速翻译预览: tiny 或 base
├── 一般翻译需求: small
├── 高质量翻译: medium 或 large
└── 专业领域翻译: large + 初始提示

2. 预处理音频 #

python
import whisper

def preprocess_and_translate(audio_path):
    audio = whisper.load_audio(audio_path)
    audio = whisper.pad_or_trim(audio)
    
    mel = whisper.log_mel_spectrogram(audio).to(model.device)
    
    options = whisper.DecodingOptions(task="translate")
    result = whisper.decode(model, mel, options)
    
    return result.text

3. 处理长音频 #

python
import whisper

model = whisper.load_model("base")

result = model.translate(
    "long_audio.mp3",
    verbose=True
)

print(f"处理了 {len(result['segments'])} 个片段")

下一步 #

掌握了语音翻译功能后,继续学习 模型详解 了解不同模型的特点和选择策略!

最后更新:2026-04-05