用python实现语音识别

读取和绘制音频数据

  实际的音频信号是复杂的连续波形,为了将其保存成数字化形式,需要对音频信号进行采样并将其转换成数字,例如:语音通常以44100Hz的频率进行采样,这就意味着每秒钟信号被分解成44100份,然后这些抽样被保存。换句话说,每隔$\frac{1}{44100}Hz$就会存储一次,如果采样率高,那么媒体播放音频时会感觉信号是连续的。

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

# 读取音频文件
sampling_freq, audio = wavfile.read('input_read.wav')

# 打印参数
print('Shape:', audio.shape)        # Shape: (132300,) 说明有132300个值
print('数据类型:', audio.dtype)     # 数据类型: int16
print('持续时间:', round(audio.shape[0] / float(sampling_freq), 3), 'seconds')
# 持续时间: 3.0 seconds
audio = audio / np.max(audio)    # 归一化

audio = audio[:30]  # 提取音频的前30个值

# 建立时间轴
x_values = np.arange(0, len(audio), 1) / float(sampling_freq)
x_values *= 1000    # 将单位转化为秒

# 画出声音信号图形
plt.plot(x_values, audio, color='blue')
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('Audio signal')
plt.show()

将音频信号转换为频域

  音频信号是不同频率、增幅和相位的正弦波的复杂混合。一个音频信号的本质由其频率内容决定,

import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt

sampling_freq, audio = wavfile.read('input_freq.wav')   # 读取文件

audio = audio / np.max(audio)   # 归一化,标准化

len_audio = len(audio)  # 3251

# 应用傅里叶变换
transformed_signal = np.fft.fft(audio)
print(transformed_signal)
# [-0.04022912+0.j         -0.04068997-0.00052721j -0.03933007-0.00448355j
#  ... -0.03947908+0.00298096j -0.03933007+0.00448355j -0.04068997+0.00052721j]
half_length = int(np.ceil((len_audio + 1) / 2.0))   # np.ceil向上取整(向大的方向取整)
transformed_signal = abs(transformed_signal[0:half_length])
print(transformed_signal)
# [0.04022912 0.04069339 0.0395848  ... 0.08001755 0.09203427 0.12889393]
transformed_signal /= float(len_audio)
transformed_signal **= 2

# 提取转换信号的长度
len_ts = len(transformed_signal)    # 1626

# 将部分信号乘以2
if len_audio % 2:   # 奇数
    transformed_signal[1:len_ts] *= 2
else:               # 偶数
    transformed_signal[1:len_ts-1] *= 2

# 获取功率信号
power = 10 * np.log10(transformed_signal)

# 建立时间轴
x_values = np.arange(0, half_length, 1) * (sampling_freq / len_audio) / 1000.0

# 绘制语音信号的
plt.figure()
plt.plot(x_values, power, color='blue')
plt.xlabel('Freq (in kHz)')
plt.ylabel('Power (in dB)')
plt.show()

自定义参数生成音频信号

合成音乐

提取频域特征

  将信号转换为频域之后,还需要将其转换为有用的形式,梅尔频率倒谱系数(MFCC),MFCC首先计算信号的功率谱,然后用滤波器组和离散余弦变换的组合来提取特征。

参考文献:

《python机器学习经典案例》美Prateek Joshi著

傅里叶变换的介绍:http://www.thefouriertransform.com/

各种音阶及其对应的频率 http://pages.mtu.edu/~suits/notefreqs.html

猜你喜欢

转载自www.cnblogs.com/LXP-Never/p/10074603.html