ASR中常用的语音特征之FBank和MFCC(原理 + Python实现)

一步一步讲解和实现ASR中常用的语音特征——FBank和MFCC的提取,包括算法原理、代码和可视化等。

完整Jupyter Notebook链接:https://github.com/Magic-Bubble/SpeechProcessForMachineLearning/blob/master/speech_process.ipynb

语音信号的产生

语音通常是指人说话的声音。从生物学的角度来看,是气流通过声带、咽喉、口腔、鼻腔等发出声音;从信号的角度来看,不同位置的震动频率不一样,最后的信号是由基频和一些谐波构成。

之后被设备接收后(比如麦克风),会通过A/D转换,将模拟信号转换为数字信号,一般会有采样、量化和编码三个步骤,采样率要遵循奈奎斯特采样定律: f s > = 2 f fs >= 2f fs>=2f,比如电话语音的频率一般在300Hz~3400Hz,所以采用8kHz的采样率足矣。

下面采用一个30s左右的16比特PCM编码后的语音wav为例。

准备工作

1. 导包

import numpy as np
from scipy.io import wavfile
from scipy.fftpack import dct
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
%matplotlib inline

2. 绘图工具

# 绘制时域图
def plot_time(signal, sample_rate):
    time = np.arange(0, len(signal)) * (1.0 / sample_rate)
    plt.figure(figsize=(20, 5))
    plt.plot(time, signal)
    plt.xlabel('Time(s)')
    plt.ylabel('Amplitude')
    plt.grid()
# 绘制频域图
def plot_freq(signal, sample_rate, fft_size=512):
    xf = np.fft.rfft(signal, fft_size) / fft_size
    freqs = np.linspace(0, sample_rate/2, fft_size/2 + 1)
    xfp = 20 * np.log10(np.clip(np.abs(xf), 1e-20, 1e100))
    plt.figure(figsize=(20, 5))
    plt.plot(freqs, xfp)
    plt.xlabel('Freq(hz)')
    plt.ylabel('dB')
    plt.grid()
# 绘制频谱图
def plot_spectrogram(spec, note):
    fig = plt.figure(figsize=(20, 5))
    heatmap = plt.pcolor(spec)
    fig.colorbar(mappable=heatmap)
    plt.xlabel('Time(s)')
    plt.ylabel(note)
    plt.tight_layout()

3. 数据准备

sample_rate, signal = wavfile.read('./resources/OSR_us_000_0010_8k.wav')
signal = signal[0: int(3.5 * sample_rate)]  # Keep the first 3.5 seconds
print('sample rate:', sample_rate, ', frame length:', len(signal))

sample rate: 8000 , frame length: 28000

plot_time(signal, sample_rate)

在这里插入图片描述

plot_freq(signal, sample_rate)

在这里插入图片描述

预加重(Pre-Emphasis)

预加重一般是数字语音信号处理的第一步。语音信号往往会有频谱倾斜(Spectral Tilt)现象,即高频部分的幅度会比低频部分的小,预加重在这里就是起到一个平衡频谱的作用,增大高频部分的幅度。它使用如下的一阶滤波器来实现:

y ( t ) = x ( t ) − α x ( t − 1 ) ,      0.95 &lt; α &lt; 0.99 y(t) = x(t) - \alpha x(t-1), \ \ \ \ 0.95 &lt; \alpha &lt; 0.99 y(t)=x(t)αx(t1),    0.95<α<0.99

笔者对这个公式的理解是:信号频率的高低主要是由信号电平变化的速度所决定,对信号做一阶差分时,高频部分(变化快的地方)差分值大,低频部分(变化慢的地方)差分值小,达到平衡频谱的作用。

pre_emphasis = 0.97
emphasized_signal = np.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])
plot_time(emphasized_signal, sample_rate)

在这里插入图片描述

plot_freq(emphasized_signal, sample_rate)

在这里插入图片描述

从下面这个图来看,确实起到了平衡频谱的作用。

分帧(Framing)

在预加重之后,需要将信号分成短时帧。做这一步的原因是:信号

### ASR-PRO语音识别模块工作原理技术细节 ASR-PRO是一款基于AI离线识别技术的语音智能识别模块,适用于多种应用场景下的语音交互功能开发。以下是关于该模块的工作原理及其关键技术细节: #### 1. **核心算法** ASR-PRO采用CTC(Connectionist Temporal Classification)技术进行序列优化[^2]。这是一种端到端的语音识别模型训练方法,能够在无需对齐的情况下直接从原始语音信号中提取特征并完成识别任务。这种方法显著提高了训练效率,并减少了传统语音识别流程中的复杂度。 #### 2. **硬件架构** ASR-PRO集成了高性能处理器专用DSP单元,用于实时处理音频信号。其内部设计支持低功耗运行模式,在保持高精度的同时延长设备续航时间[^1]。 #### 3. **语音采集预处理** 当麦克风捕获用户的语音输入时,这些声音会被转换成数字信号并通过一系列预处理步骤来增强质量。具体包括但不限于降噪、回声消除以及动态范围压缩等操作[^3]。 #### 4. **特征提取** 经过初步清理后的音频数据会进入下一阶段——即特征提取环节。在此过程中,系统利用MFCC(Mel-Frequency Cepstral Coefficients)、FBank或其他类似的表示形式将时域上的波形转化为频谱特性向量集合[^2]。 #### 5. **模型匹配** 提取出来的特征被送入预先构建好的神经网络模型当中进行分类预测。由于采用了CTC机制,因此即使存在发音速度差异或者背景噪声干扰等情况也能够获得较为准确的结果反馈[^2]。 #### 6. **自定义词条配置** 为了满足不同场景下个性化需求的能力,开发者可以通过配套工具轻松设置专属命令词列表给定目标对象执行相应动作指令。 ```python # 示例代码展示如何初始化ASR-PRO并主机建立连接 import serial def init_asr_pro(port='/dev/ttyUSB0', baudrate=9600): ser = serial.Serial(port, baudrate) if not ser.is_open: raise Exception("Failed to open the port.") return ser asr_serial = init_asr_pro() print("ASR-PRO initialized successfully!") ``` ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值