多模态语音合成与识别:从 Whisper + TTS 到实时语音交互的 LLM 实践

系统拆解 LLM 语音技术栈:语音识别(ASR / Whisper)、语音合成(TTS / ElevenLabs / Coqui TTS)、语音活动检测(VAD)。 覆盖实时语音交互架构(流式识别 + 流式合成 + 打断机制)、多语言语音克隆、以及语音 Agent 的安全与隐私考量。 附完整的 Whisper API 集成、本地 TTS 部署、WebRTC 实时语音管道代码。

🎙️ 前置:了解基础 LLM API 调用(LLM API 基础指南)。


1. 语音技术栈全景

用户语音输入
    │
    ▼
┌─────────────────┐
│  VAD 检测       │  ← 检测说话开始/结束
└─────────────────┘
    │
    ▼
┌─────────────────┐
│  ASR (Whisper)  │  ← 语音 → 文本
└─────────────────┘
    │
    ▼
┌─────────────────┐
│  LLM 文本推理   │  ← 文本 → 文本回答
└─────────────────┘
    │
    ▼
┌─────────────────┐
│  TTS 合成       │  ← 文本 → 语音
└─────────────────┘
    │
    ▼
  语音输出

2. 语音识别(ASR):Whisper 体系

2.1 OpenAI Whisper API

from openai import OpenAI
client = OpenAI()

audio_file = open("speech.mp3", "rb")
transcript = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    language="zh",  # 指定语言提升准确率
    response_format="verbose_json",  # 含时间戳
    timestamp_granularities=["word"],  # 词级时间戳
)
print(transcript.text)

2.2 本地 Whisper( faster-whisper )

pip install faster-whisper
from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda", compute_type="float16")

segments, info = model.transcribe("audio.mp3", beam_size=5, language="zh")

print(f"检测到语言: {info.language}, 概率: {info.language_probability:.2f}")

for segment in segments:
    print(f"[{segment.start:.2f}{segment.end:.2f}] {segment.text}")
模型大小实时因子 (RTF)中文准确率适用场景
tiny39MB0.0570%低功耗设备
base74MB0.180%实时移动端
small244MB0.385%边缘计算
medium769MB0.890%服务器
large-v31550MB2.095%高精度离线

3. 语音合成(TTS)

3.1 OpenAI TTS API

response = client.audio.speech.create(
    model="tts-1",
    voice="alloy",  # alloy, echo, fable, onyx, nova, shimmer
    input="欢迎来到 Birdor,您的 AI 助手已准备就绪。",
    speed=1.0,
)

response.stream_to_file("output.mp3")

3.2 ElevenLabs(最佳质量)

from elevenlabs import generate, play, set_api_key

set_api_key("YOUR_KEY")

audio = generate(
    text="这是一段高质量的语音合成演示。",
    voice="Bella",  # 或自定义克隆声音
    model="eleven_multilingual_v2",
)

play(audio)

3.3 Coqui TTS(开源本地运行)

pip install TTS
from TTS.api import TTS

# 加载多语言模型
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")

# 克隆声音(用 6 秒参考音频)
tts.tts_to_file(
    text="你好,这是用你的声音合成的中文语音。",
    speaker_wav="reference_voice.wav",
    language="zh",
    file_path="cloned_output.wav",
)

4. 实时语音交互架构

4.1 核心组件

import asyncio
import numpy as np
import torch

class RealtimeVoiceAgent:
    def __init__(self):
        self.vad = VADModel()          # 语音活动检测
        self.asr = WhisperModel("base")  # 语音识别
        self.llm = OpenAIClient()      # 大语言模型
        self.tts = TTSClient()         # 语音合成
        self.is_speaking = False       # Agent 是否在说话
        self.user_interrupt = False    # 用户是否打断

    async def audio_stream_loop(self):
        """持续监听音频输入"""
        audio_buffer = []

        async for chunk in microphone_stream():
            # VAD 检测
            speech_prob = self.vad(chunk)

            if speech_prob > 0.5:
                audio_buffer.append(chunk)
            elif audio_buffer:
                # 用户说完一句,开始处理
                await self.process_utterance(audio_buffer)
                audio_buffer = []

    async def process_utterance(self, audio_chunks):
        # 1. ASR
        text = self.asr.transcribe(np.concatenate(audio_chunks))

        # 2. 如果 Agent 正在说话,先中断
        if self.is_speaking:
            self.user_interrupt = True
            await self.tts.stop()

        # 3. LLM 推理
        response_text = await self.llm.chat(text)

        # 4. TTS 合成(流式)
        self.is_speaking = True
        await self.tts.speak_streaming(response_text)
        self.is_speaking = False

4.2 WebRTC 实时音频管道

# 使用 aiortc 实现浏览器 ↔ 服务器的实时音频通信
from aiortc import RTCPeerConnection, MediaStreamTrack
from aiortc.contrib.media import MediaPlayer, MediaRecorder

class AudioTrack(MediaStreamTrack):
    kind = "audio"

    async def recv(self):
        frame = await self.track.recv()
        # 将音频帧送入 VAD/ASR 管道
        audio_data = frame.to_ndarray()
        await process_audio_chunk(audio_data)
        return frame

# 前端使用 Web Audio API + getUserMedia
# 音频通过 WebRTC 传输到 Python 服务端

5. 语音克隆(Voice Cloning)

5.1 XTTS v2 本地克隆

from TTS.api import TTS

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")

# 只需 6 秒参考音频即可克隆
tts.tts_to_file(
    text="这是用克隆声音说出的中文句子。",
    speaker_wav="my_voice_6s.wav",
    language="zh",
    file_path="cloned.wav",
)

5.2 语音克隆的伦理边界

⚠️ 安全红线
├── 绝不克隆未授权人员的声音
├── 明确标注 AI 合成语音
├── 金融场景禁用语音克隆(防诈骗)
├── 提供声音水印 / 检测接口
└── 保留合成日志用于追溯

6. 成本估算

组件API 成本本地成本实时延迟
ASR (Whisper API)$0.006/分钟GPU $0.02/小时1-3s
TTS (OpenAI)$0.015/1K字符CPU 免费<1s
TTS (ElevenLabs)$0.18/1K字符不支持<1s
VAD免费(silero)CPU 免费50ms

实时语音会话成本(10 分钟):

  • ASR: $0.06
  • LLM: ~$0.10(假设 2K token 往返)
  • TTS: ~$0.03
  • 总计: ~$0.19 / 10 分钟

7. 总结与选型

场景ASRTTS架构建议
客服机器人Whisper APIOpenAI TTS流式 ASR → LLM → 流式 TTS
播客生成Whisper + 校对ElevenLabs批量处理,人工校对
语音助手(设备端)Whisper tinyPicoTTS本地运行,低延迟
多语言翻译Whisper largeXTTS v2ASR → LLM翻译 → TTS 目标语言
有声读物WhisperCoqui TTS批量,低成本

📂 继续阅读:

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「llm」更多文章