语音识别降噪python代码
时间: 2023-07-23 16:08:02 浏览: 140
语音识别代码
5星 · 资源好评率100%
这里提供一个基于Python的语音降噪代码,使用了带有噪声的wav格式音频文件作为输入,并输出降噪后的音频文件。
首先需要安装以下Python库:
1. numpy
2. scipy
3. wave
代码如下:
```python
import numpy as np
from scipy.io import wavfile
import wave
import os
def load_wave_file(file_path):
"""
加载wav格式音频文件
:param file_path: 文件路径
:return: 音频文件采样率和采样数据
"""
with wave.open(file_path, 'rb') as wf:
num_channels = wf.getnchannels()
sample_width = wf.getsampwidth()
frame_rate = wf.getframerate()
num_frames = wf.getnframes()
data = wf.readframes(num_frames)
samples = np.fromstring(data, dtype=np.int16)
return frame_rate, samples
def save_wave_file(file_path, sample_rate, data):
"""
保存音频文件
:param file_path: 文件路径
:param sample_rate: 音频采样率
:param data: 音频数据
"""
with wave.open(file_path, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(sample_rate)
wf.writeframes(data)
def spectral_subtraction(input_file_path, output_file_path, noise_file_path):
"""
语音降噪
:param input_file_path: 带噪声的音频文件路径
:param output_file_path: 降噪后的音频文件路径
:param noise_file_path: 噪声文件路径
"""
# 加载音频文件和噪声文件
sr, audio = load_wave_file(input_file_path)
_, noise = load_wave_file(noise_file_path)
# 将音频数据和噪声数据转换为时频表示
audio_stft = np.fft.rfft(audio)
noise_stft = np.fft.rfft(noise)
# 计算语音信号和噪声信号的功率谱
audio_power = np.abs(audio_stft) ** 2
noise_power = np.abs(noise_stft) ** 2
# 估计噪声功率谱
noise_power_estimate = np.median(noise_power, axis=1)
# 计算噪声功率谱的平均值
noise_power_average = np.mean(noise_power_estimate)
# 如果噪声功率谱低于某个阈值,则将其设置为阈值
if noise_power_average < 0.01:
noise_power_average = 0.01
# 计算信噪比
snr = 10 * np.log10(audio_power / noise_power_estimate)
# 将信噪比限制在某个范围内
snr_min = 10
snr_max = 20
snr = np.maximum(snr, snr_min)
snr = np.minimum(snr, snr_max)
# 计算降噪后的信号功率谱
denoise_power = audio_power - noise_power_estimate * (10 ** (snr / 10))
# 修正功率谱
denoise_power[denoise_power < 0] = 0
# 计算降噪后的音频数据
denoise_stft = audio_stft * np.sqrt(denoise_power / audio_power)
denoise = np.fft.irfft(denoise_stft)
# 保存降噪后的音频文件
save_wave_file(output_file_path, sr, denoise.astype(np.int16))
if __name__ == '__main__':
input_file = 'input.wav' # 带噪声的音频文件
output_file = 'output.wav' # 降噪后的音频文件
noise_file = 'noise.wav' # 噪声文件
spectral_subtraction(input_file, output_file, noise_file)
```
需要将上述代码保存为.py文件,并将带噪声的音频文件和噪声文件放置在同一目录下,然后运行该代码即可得到降噪后的音频文件。需要注意的是,代码中的语音降噪算法是基于频域的,因此需要保证音频文件和噪声文件的采样率相同。
阅读全文