智能语音技术(九)
·
语音听写(Speech-to-Text, STT),也称为自动语音识别(Automatic Speech Recognition, ASR),是指将人类语音信号自动转换为相应文本的技术。其核心流程和技术要点如下:
-
信号预处理
- 采样与量化: 模拟声音信号(声波)被麦克风拾取后,首先进行模数转换(ADC)。这涉及采样(以特定频率fsf_sfs Hz,如16kHz或44.1kHz,对连续信号进行离散取值)和量化(将每个采样点的幅度值映射到离散的数字级别)。
- 预加重: 使用高通滤波器提升高频分量能量,补偿声音在传播过程中高频部分的衰减,使频谱更平坦,便于后续处理。常用传递函数为:
H(z)=1−a⋅z−1(a≈0.97) H(z) = 1 - a \cdot z^{-1} \quad (a \approx 0.97) H(z)=1−a⋅z−1(a≈0.97) - 分帧与加窗: 语音信号是时变的,但在短时间段(如20-40ms)内可近似视为平稳。将连续信号分割成帧(帧长NNN个采样点),相邻帧之间有重叠(如10ms)。为避免帧两端信号不连续造成的频谱泄露,需加窗(如汉明窗w(n)w(n)w(n))平滑:
w(n)=0.54−0.46⋅cos(2πnN−1)(0≤n≤N−1) w(n) = 0.54 - 0.46 \cdot \cos\left(\frac{2\pi n}{N-1}\right) \quad (0 \leq n \leq N-1) w(n)=0.54−0.46⋅cos(N−12πn)(0≤n≤N−1)
-
特征提取
目的是提取能有效区分不同语音单元(音素)的关键信息,降低维度。- 时域特征: 如短时能量、过零率(ZCR),简单但区分度有限。
- 频域特征:
- 短时傅里叶变换(STFT): 计算每帧信号的频谱。
Xk=∑n=0N−1x(n)⋅w(n)⋅e−j2πNkn X_k = \sum_{n=0}^{N-1} x(n) \cdot w(n) \cdot e^{-j \frac{2\pi}{N} kn} Xk=n=0∑N−1x(n)⋅w(n)⋅e−jN2πkn - 梅尔频率倒谱系数(MFCC): 最经典且常用的特征。
- 计算STFT得到频谱∣Xk∣|X_k|∣Xk∣。
- 应用梅尔滤波器组:将线性频率fff(Hz)映射到感知相关的梅尔频率mmm:
m=2595⋅log10(1+f700) m = 2595 \cdot \log_{10}(1 + \frac{f}{700}) m=2595⋅log10(1+700f)
设计一组三角滤波器覆盖整个频率范围,计算每个滤波器的能量输出。 - 取对数(模拟人耳响度感知)。
- 离散余弦变换(DCT):对对数能量做DCT,得到倒谱系数。通常取前12-13维作为MFCC。
- 常补充一阶(Δ\DeltaΔ)、二阶差分(ΔΔ\Delta\DeltaΔΔ)系数,表征动态信息。
- 短时傅里叶变换(STFT): 计算每帧信号的频谱。
- 其他特征: 如感知线性预测(PLP)、滤波器组能量(FBank)等。
-
声学模型
负责将提取的特征序列映射到基本的语音单元(音素、子音素状态)序列。- 传统方法: 隐马尔可夫模型(HMM)与高斯混合模型(GMM)结合(GMM-HMM)。
- HMM:建模语音单元的时间序列特性(状态转移)。
- GMM:建模在某个HMM状态下,观测特征向量的概率分布。
- 深度学习方法: 深度神经网络(DNN)等取代GMM作为观测概率模型。
- DNN-HMM: DNN输出给定特征下属于各个HMM状态的概率P(s∣x)P(s|\mathbf{x})P(s∣x)。
- 端到端模型: 直接学习特征序列到音素/字符序列的映射。
- 连接主义时序分类(CTC): 引入空白标签(blank),允许输出序列长度可变,无需强制对齐。
- 基于注意力机制的序列到序列模型(Attention-based Seq2Seq): 编码器将特征序列编码为上下文向量,解码器基于注意力机制生成文本序列。
- Transformer: 基于自注意力机制的强大模型,成为当前主流。
- 传统方法: 隐马尔可夫模型(HMM)与高斯混合模型(GMM)结合(GMM-HMM)。
-
语言模型
利用语言的统计规律(词与词之间的组合概率),约束解码过程,提高识别准确率,特别是解决同音词歧义。- N-gram模型: 估计序列w1,w2,…,wTw_1, w_2, \ldots, w_Tw1,w2,…,wT出现的概率:
P(w1,w2,…,wT)≈∏i=1TP(wi∣wi−N+1,…,wi−1) P(w_1, w_2, \ldots, w_T) \approx \prod_{i=1}^{T} P(w_i | w_{i-N+1}, \ldots, w_{i-1}) P(w1,w2,…,wT)≈i=1∏TP(wi∣wi−N+1,…,wi−1)
常用N=3N=3N=3(三元文法)。需要在大规模文本语料上训练。 - 神经网络语言模型(NNLM): 利用神经网络(如RNN, LSTM, Transformer)建模更复杂的上下文依赖关系,表达能力更强。
- N-gram模型: 估计序列w1,w2,…,wTw_1, w_2, \ldots, w_Tw1,w2,…,wT出现的概率:
-
解码器
结合声学模型和语言模型的输出,在可能的候选序列中搜索最优(概率最大)的文本序列。这是一个搜索问题。- 动态解码算法: 如维特比算法(Viterbi),适用于HMM框架。
- 集束搜索(Beam Search): 在每个时间步保留概率最高的KKK条路径(KKK为束宽),是Seq2Seq模型中常用的解码策略。
典型应用场景:
- 会议记录与转写
- 字幕生成(视频、直播)
- 语音输入法
- 智能客服与语音助手
- 医疗报告听写
- 车载语音控制
- 智能家居控制
# 示意性代码:简单的MFCC特征计算(仅核心步骤,省略细节)
import numpy as np
import librosa
def compute_mfcc(audio, sr=16000, n_mfcc=13):
# 预加重
audio = librosa.effects.preemphasis(audio)
# 分帧加窗 (STFT)
frames = librosa.util.frame(audio, frame_length=2048, hop_length=512)
windowed_frames = frames * np.hamming(2048)[:, None]
# 计算幅度谱
mag_spec = np.abs(np.fft.rfft(windowed_frames, axis=0))
# 梅尔滤波器组
mel_filters = librosa.filters.mel(sr, n_fft=2048, n_mels=40)
# 应用滤波器组 (取对数)
mel_energy = np.log(mel_filters @ mag_spec + 1e-10) # 加小值防log(0)
# DCT (取前n_mfcc维)
mfcc = librosa.dct(mel_energy, axis=0)[:n_mfcc]
# 计算差分系数 (可选)
# delta = librosa.feature.delta(mfcc)
# delta_delta = librosa.feature.delta(mfcc, order=2)
# return np.vstack([mfcc, delta, delta_delta]) # 组合静态+动态特征
return mfcc
# 示例用法
audio, sr = librosa.load("speech.wav", sr=16000)
mfcc_features = compute_mfcc(audio, sr=sr)
print(mfcc_features.shape) # 例如 (13, 帧数)
理解这些核心知识点是掌握语音听写技术的基础。实际系统还需考虑噪声鲁棒性、说话人自适应、方言/口音处理、端点检测、大词汇量连续语音识别等诸多挑战。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)