语音听写(Speech-to-Text, STT),也称为自动语音识别(Automatic Speech Recognition, ASR),是指将人类语音信号自动转换为相应文本的技术。其核心流程和技术要点如下:

  1. 信号预处理

    • 采样与量化: 模拟声音信号(声波)被麦克风拾取后,首先进行模数转换(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)=1az1(a0.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.540.46cos(N12πn)(0nN1)
  2. 特征提取
    目的是提取能有效区分不同语音单元(音素)的关键信息,降低维度。

    • 时域特征: 如短时能量、过零率(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=0N1x(n)w(n)ejN2πkn
      • 梅尔频率倒谱系数(MFCC): 最经典且常用的特征。
        1. 计算STFT得到频谱∣Xk∣|X_k|Xk
        2. 应用梅尔滤波器组:将线性频率fff(Hz)映射到感知相关的梅尔频率mmm
          m=2595⋅log⁡10(1+f700) m = 2595 \cdot \log_{10}(1 + \frac{f}{700}) m=2595log10(1+700f)
          设计一组三角滤波器覆盖整个频率范围,计算每个滤波器的能量输出。
        3. 取对数(模拟人耳响度感知)。
        4. 离散余弦变换(DCT):对对数能量做DCT,得到倒谱系数。通常取前12-13维作为MFCC。
        5. 常补充一阶(Δ\DeltaΔ)、二阶差分(ΔΔ\Delta\DeltaΔΔ)系数,表征动态信息。
    • 其他特征: 如感知线性预测(PLP)、滤波器组能量(FBank)等。
  3. 声学模型
    负责将提取的特征序列映射到基本的语音单元(音素、子音素状态)序列。

    • 传统方法: 隐马尔可夫模型(HMM)与高斯混合模型(GMM)结合(GMM-HMM)。
      • HMM:建模语音单元的时间序列特性(状态转移)。
      • GMM:建模在某个HMM状态下,观测特征向量的概率分布。
    • 深度学习方法: 深度神经网络(DNN)等取代GMM作为观测概率模型。
      • DNN-HMM: DNN输出给定特征下属于各个HMM状态的概率P(s∣x)P(s|\mathbf{x})P(sx)
      • 端到端模型: 直接学习特征序列到音素/字符序列的映射。
        • 连接主义时序分类(CTC): 引入空白标签(blank),允许输出序列长度可变,无需强制对齐。
        • 基于注意力机制的序列到序列模型(Attention-based Seq2Seq): 编码器将特征序列编码为上下文向量,解码器基于注意力机制生成文本序列。
        • Transformer: 基于自注意力机制的强大模型,成为当前主流。
  4. 语言模型
    利用语言的统计规律(词与词之间的组合概率),约束解码过程,提高识别准确率,特别是解决同音词歧义。

    • 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=1TP(wiwiN+1,,wi1)
      常用N=3N=3N=3(三元文法)。需要在大规模文本语料上训练。
    • 神经网络语言模型(NNLM): 利用神经网络(如RNN, LSTM, Transformer)建模更复杂的上下文依赖关系,表达能力更强。
  5. 解码器
    结合声学模型和语言模型的输出,在可能的候选序列中搜索最优(概率最大)的文本序列。这是一个搜索问题。

    • 动态解码算法: 如维特比算法(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, 帧数)

理解这些核心知识点是掌握语音听写技术的基础。实际系统还需考虑噪声鲁棒性、说话人自适应、方言/口音处理、端点检测、大词汇量连续语音识别等诸多挑战。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐