Skip to content

语音 AI:自动语音识别与合成

语音 AI 是 AI 与人类交互的关键接口,包括自动语音识别(ASR)和语音合成(TTS)。

核心任务

1. 自动语音识别 (ASR)

目标:将语音转换为文本。

应用场景

  • 语音助手(Siri, Alexa, 小爱同学)
  • 会议转录(Zoom, Teams)
  • 字幕生成(YouTube, 抖音)
  • 医疗记录(医生口述转文字)

技术挑战

  • 背景噪声
  • 口音、方言
  • 重叠说话(overlapping speech)
  • 低资源语言

2. 语音合成 (TTS)

目标:将文本转换为自然语音。

应用场景

  • 虚拟助手语音回复
  • 有声书制作
  • 导航语音
  • 辅助功能(为视障人士朗读)

技术挑战

  • 自然度(自然度、韵律、情感)
  • 音色克隆(Voice Cloning)
  • 多语言支持
  • 实时性(低延迟)

ASR 技术演进

传统方法(2010s)

GMM-HMM:高斯混合模型 + 隐马尔可夫模型

text
声学特征 (MFCC) → GMM(状态概率)→ HMM(时序建模)→ 解码器(搜索最佳词序列)

缺点:性能有限,依赖大量语言学规则。

深度学习时代

端到端模型

CTC(Connectionist Temporal Classification)

python
import torch
import torchaudio
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor

# 1. 加载预训练模型(英文)
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")

# 2. 准备音频(16kHz,单声道)
speech_array, sr = torchaudio.load("audio.wav")
if sr != 16000:
    resampler = torchaudio.transforms.Resample(sr, 16000)
    speech_array = resampler(speech_array)

# 3. 推理
inputs = processor(speech_array[0], sampling_rate=16000, return_tensors="pt", padding=True)
with torch.no_grad():
    logits = model(**inputs).logits
predicted_ids = torch.argmax(logits, dim=-1)

# 4. 解码
transcription = processor.batch_decode(predicted_ids)[0]
print(transcription)

优点:无需对齐,直接预测字符/词。 缺点:不能直接输出词边界,需要语言模型融合。

Sequence-to-Sequence (Seq2Seq)

Listen-Attend-Spell (LAS)

Encoder(语音特征) → Attention → Decoder(逐词生成)

特点:Attention 机制让解码器关注不同语音段。

Transformer-based

Whisper(OpenAI):当前最流行的开源 ASR

python
from transformers import WhisperForConditionalGeneration, WhisperProcessor

model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v3")
processor = WhisperProcessor.from_pretrained("openai/whisper-large-v3")

# 多语言支持
inputs = processor(audio, sampling_rate=16000, return_tensors="pt")
with torch.no_grad():
    generated_ids = model.generate(**inputs, language="chinese", task="transcribe")
transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]

Whisper 特点

  • 多语言(99 种语言)
  • 鲁棒性强(带背景噪声、口音)
  • 免费开源,无需商业许可
  • 可本地部署

Conformer(Squeezeformer, Wav2Vec 2.0)

结合 CNN(局部特征)和 Transformer(全局依赖):

python
from transformers import SpeechT5Processor, SpeechT5ForSpeechToText

processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_asr")
model = SpeechT5ForSpeechToText.from_pretrained("microsoft/speecht5_asr")

inputs = processor(audio=audio_array, sampling_rate=16000, return_tensors="pt")
with torch.no_grad():
    outputs = model.generate(**inputs)
transcription = processor.batch_decode(outputs, skip_special_tokens=True)[0]

TTS 技术演进

传统方法

拼接合成(Concatenative TTS)

  • 从录音库中拼接音素
  • 质量高但灵活性差
  • 需要大量录音

参数合成(Parametric TTS)

  • 使用 HMM 或 DNN 生成声学参数
  • 再通过声码器(vocoder)合成波形
  • 灵活性好但音质一般

深度学习时代

Tacotron 系列

Tacotron 2(Google):

文本 → 字符/音素 → Encoder(BiLSTM) → Decoder(Attention) → Spectrogram → WaveNet(声码器)
python
# 使用 NVIDIA Tacotron 2 + WaveGlow
# 需要自定义训练,HuggingFace 有预训练版本

FastSpeech / FastSpeech 2

非自回归,速度快:

文本 → Encoder → Duration Predictor → Length Regulator → Decoder → Spectrogram → HiFi-GAN

优点:速度快(实时 10-30×),稳定性高。

VITS(Variational Inference with adversarial learning for TTS)

当前 SOTA 开源 TTS 模型:

python
from transformers import VitsModel, AutoTokenizer

model = VitsModel.from_pretrained("facebook/mms-tts-eng")
tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-eng")

inputs = tokenizer("Hello, I am a text-to-speech model.", return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)
    waveform = outputs.waveform

# 保存为 wav
import scipy
scipy.io.wavfile.write("output.wav", rate=model.config.sampling_rate, data=waveform[0].numpy())

特点

  • 端到端训练
  • 支持 1000+ 语言(MMS 项目)
  • 质量高,速度较快

Bark(Sunflower AI)

多语言、多情感、可生成笑声、叹息等:

python
from transformers import AutoProcessor, BarkModel
import scipy

processor = AutoProcessor.from_pretrained("suno/bark")
model = BarkModel.from_pretrained("suno/bark")

inputs = processor("Hello, this is a test.", voice_preset="v2/en_speaker_6")
audio = model.generate(**inputs)
audio_np = audio.cpu().numpy().squeeze()

# 采样率 24kHz
scipy.io.wavfile.write("bark_out.wav", rate=24000, data=audio_np)

缺点:生成速度慢(非自回归 + 高质量声码器)


实战:构建多语言客服语音助手

架构设计

用户语音 → ASR(Whisper) → 文本 → LLM(问答) → TTS(VITS) → 语音回复

代码实现

python
import torchaudio
from transformers import WhisperProcessor, WhisperForConditionalGeneration, AutoTokenizer, AutoModelForCausalLM, VitsModel

# 1. ASR 模型
asr_processor = WhisperProcessor.from_pretrained("openai/whisper-base")
asr_model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-base")

def speech_to_text(audio_path):
    speech, sr = torchaudio.load(audio_path)
    if sr != 16000:
        resampler = torchaudio.transforms.Resample(sr, 16000)
        speech = resampler(speech)
    inputs = asr_processor(speech[0], sampling_rate=16000, return_tensors="pt")
    with torch.no_grad():
        generated = asr_model.generate(**inputs, language="chinese", task="transcribe")
    return asr_processor.batch_decode(generated, skip_special_tokens=True)[0]

# 2. LLM(问答)
llm_tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-1_8B-Chat")
llm_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1_8B-Chat", device_map="auto")

def text_to_response(question):
    prompt = f"用户:{question}\n助手:"
    inputs = llm_tokenizer(prompt, return_tensors="pt").to(llm_model.device)
    with torch.no_grad():
        outputs = llm_model.generate(**inputs, max_new_tokens=200)
    return llm_tokenizer.decode(outputs[0], skip_special_tokens=True).split("助手:")[-1]

# 3. TTS 模型
tts_processor = AutoProcessor.from_pretrained("facebook/mms-tts-chi")
tts_model = VitsModel.from_pretrained("facebook/mms-tts-chi")

def text_to_speech(text, output_path="response.wav"):
    inputs = tts_processor(text=text, return_tensors="pt")
    with torch.no_grad():
        audio = tts_model(**inputs).waveform
    scipy.io.wavfile.write(output_path, rate=tts_model.config.sampling_rate, data=audio[0].numpy())

# 4. 完整流程
def speech_to_speech(audio_path):
    question = speech_to_text(audio_path)
    print(f"识别:{question}")
    answer = text_to_response(question)
    print(f"回答:{answer}")
    text_to_speech(answer)
    return "response.wav"

# 使用
result_wav = speech_to_speech("user_question.wav")

关键技术

1. 声学特征提取

  • MFCC(梅尔频率倒谱系数):传统特征,模拟人耳感知
  • Filter Banks(滤波器组):更细粒度的频谱
  • Raw Audio:端到端直接输入波形(Wav2Vec 2.0)

2. 语言模型融合

ASR 后处理:将音素序列转为词序列,提升准确率:

python
# 使用 KenLM 或 HuggingFace Transformers
from transformers import AutoModelForCausalLM, AutoTokenizer

lm = AutoModelForCausalLM.from_pretrained("gpt2")
# 在解码时融合 LM 分数(shallow fusion)

3. 流式识别(Streaming ASR)

实时语音识别需要低延迟:

流式分块 → Encoder(chunk-wise)→ 在线解码 → 持续输出

工具

  • NVIDIA Riva:企业级流式 ASR/TTS
  • SenseVoice:快速中文 ASR
  • Whisper Streaming:社区实现

数据集

任务数据集语言时长用途
ASRLibriSpeech英语1000h通用阅读语音
ASRCommon Voice100+ 语种10000h+多语言
ASRAISHELL-1/2中文普通话200h/1000h中文
TTSLJ Speech英语24h单说话人 TTS
TTSHiFi-TTS多语种300h+高质量
TTSChinese Standard Mandarin Speech Corpus中文80h中文 TTS

开源工具

工具类型语言说明
WhisperASR多语言OpenAI,最流行
VITSTTS多语言质量 SOTA
BarkTTS多语言情感丰富,慢
Coqui TTSTTS多语言易用,社区活跃
ESPnetASR/TTS多语言研究常用
KaldiASR多语言传统,生产环境
RivaASR/TTS多语言NVIDIA 商用,流式

挑战与未来

挑战

  1. 低资源语言:数据少,性能差(XLS-R, mSLAM 试图解决)
  2. 口音和方言:方言识别准确率低
  3. 实时性:流式识别 vs 准确性权衡
  4. 隐私:语音包含敏感信息,本地部署需求

趋势

  1. 多模态融合:唇动视频 + 音频 → 提升噪声环境准确率
  2. 零样本语言识别:Whisper 已支持,不需要语言标识
  3. 个性化声音:用少量样本克隆用户声音(ElevenLabs)
  4. 情感语音:TTS 生成带情感的声音(兴奋、悲伤)
  5. 对话式 TTS:根据上下文调整语调(像真人一样)

入门建议

  1. ASR 入门:Whisper 最简单,HuggingFace 直接调用
  2. TTS 入门:VITS 或 Coqui TTS,'pip install TTS'
  3. 中文优化:AISHELL 数据集训练,使用 FunASR(阿里)
  4. 流式应用:考虑 NVIDIA Riva 或 SenseVoice

语音 AI 技术成熟,但高质量部署仍需调优。建议从 Whisper + VITS 快速原型开始,再根据需求优化。