语音 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:社区实现
数据集
| 任务 | 数据集 | 语言 | 时长 | 用途 |
|---|---|---|---|---|
| ASR | LibriSpeech | 英语 | 1000h | 通用阅读语音 |
| ASR | Common Voice | 100+ 语种 | 10000h+ | 多语言 |
| ASR | AISHELL-1/2 | 中文普通话 | 200h/1000h | 中文 |
| TTS | LJ Speech | 英语 | 24h | 单说话人 TTS |
| TTS | HiFi-TTS | 多语种 | 300h+ | 高质量 |
| TTS | Chinese Standard Mandarin Speech Corpus | 中文 | 80h | 中文 TTS |
开源工具
| 工具 | 类型 | 语言 | 说明 |
|---|---|---|---|
| Whisper | ASR | 多语言 | OpenAI,最流行 |
| VITS | TTS | 多语言 | 质量 SOTA |
| Bark | TTS | 多语言 | 情感丰富,慢 |
| Coqui TTS | TTS | 多语言 | 易用,社区活跃 |
| ESPnet | ASR/TTS | 多语言 | 研究常用 |
| Kaldi | ASR | 多语言 | 传统,生产环境 |
| Riva | ASR/TTS | 多语言 | NVIDIA 商用,流式 |
挑战与未来
挑战
- 低资源语言:数据少,性能差(XLS-R, mSLAM 试图解决)
- 口音和方言:方言识别准确率低
- 实时性:流式识别 vs 准确性权衡
- 隐私:语音包含敏感信息,本地部署需求
趋势
- 多模态融合:唇动视频 + 音频 → 提升噪声环境准确率
- 零样本语言识别:Whisper 已支持,不需要语言标识
- 个性化声音:用少量样本克隆用户声音(ElevenLabs)
- 情感语音:TTS 生成带情感的声音(兴奋、悲伤)
- 对话式 TTS:根据上下文调整语调(像真人一样)
入门建议
- ASR 入门:Whisper 最简单,HuggingFace 直接调用
- TTS 入门:VITS 或 Coqui TTS,'pip install TTS'
- 中文优化:AISHELL 数据集训练,使用 FunASR(阿里)
- 流式应用:考虑 NVIDIA Riva 或 SenseVoice
语音 AI 技术成熟,但高质量部署仍需调优。建议从 Whisper + VITS 快速原型开始,再根据需求优化。
