Python譜減法語(yǔ)音降噪實(shí)例
代碼中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次冪。
#!/usr/bin/env python
import numpy as np
import wave
import nextpow2
import math
# 打開(kāi)WAV文檔
f = wave.open("filename.wav")
# 讀取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
fs = framerate
# 讀取波形數(shù)據(jù)
str_data = f.readframes(nframes)
f.close()
# 將波形數(shù)據(jù)轉(zhuǎn)換為數(shù)組
x = np.fromstring(str_data, dtype=np.short)
# 計(jì)算參數(shù)
len_ = 20 * fs // 1000
PERC = 50
len1 = len_ * PERC // 100
len2 = len_ - len1
# 設(shè)置默認(rèn)參數(shù)
Thres = 3
Expnt = 2.0
beta = 0.002
G = 0.9
# 初始化漢明窗
win = np.hamming(len_)
# normalization gain for overlap+add with 50% overlap
winGain = len2 / sum(win)
# Noise magnitude calculations - assuming that the first 5 frames is noise/silence
nFFT = 2 * 2 ** (nextpow2.nextpow2(len_))
noise_mean = np.zeros(nFFT)
j = 0
for k in range(1, 6):
noise_mean = noise_mean + abs(np.fft.fft(win * x[j:j + len_], nFFT))
j = j + len_
noise_mu = noise_mean / 5
# --- allocate memory and initialize various variables
k = 1
img = 1j
x_old = np.zeros(len1)
Nframes = len(x) // len2 - 1
xfinal = np.zeros(Nframes * len2)
# ========================= Start Processing ===============================
for n in range(0, Nframes):
# Windowing
insign = win * x[k-1:k + len_ - 1]
# compute fourier transform of a frame
spec = np.fft.fft(insign, nFFT)
# compute the magnitude
sig = abs(spec)
# save the noisy phase information
theta = np.angle(spec)
SNRseg = 10 * np.log10(np.linalg.norm(sig, 2) ** 2 / np.linalg.norm(noise_mu, 2) ** 2)
def berouti(SNR):
if -5.0 <= SNR <= 20.0:
a = 4 - SNR * 3 / 20
else:
if SNR < -5.0:
a = 5
if SNR > 20:
a = 1
return a
def berouti1(SNR):
if -5.0 <= SNR <= 20.0:
a = 3 - SNR * 2 / 20
else:
if SNR < -5.0:
a = 4
if SNR > 20:
a = 1
return a
if Expnt == 1.0: # 幅度譜
alpha = berouti1(SNRseg)
else: # 功率譜
alpha = berouti(SNRseg)
#############
sub_speech = sig ** Expnt - alpha * noise_mu ** Expnt;
# 當(dāng)純凈信號(hào)小于噪聲信號(hào)的功率時(shí)
diffw = sub_speech - beta * noise_mu ** Expnt
# beta negative components
def find_index(x_list):
index_list = []
for i in range(len(x_list)):
if x_list[i] < 0:
index_list.append(i)
return index_list
z = find_index(diffw)
if len(z) > 0:
# 用估計(jì)出來(lái)的噪聲信號(hào)表示下限值
sub_speech[z] = beta * noise_mu[z] ** Expnt
# --- implement a simple VAD detector --------------
if SNRseg < Thres: # Update noise spectrum
noise_temp = G * noise_mu ** Expnt + (1 - G) * sig ** Expnt # 平滑處理噪聲功率譜
noise_mu = noise_temp ** (1 / Expnt) # 新的噪聲幅度譜
# flipud函數(shù)實(shí)現(xiàn)矩陣的上下翻轉(zhuǎn),是以矩陣的“水平中線”為對(duì)稱(chēng)軸
# 交換上下對(duì)稱(chēng)元素
sub_speech[nFFT // 2 + 1:nFFT] = np.flipud(sub_speech[1:nFFT // 2])
x_phase = (sub_speech ** (1 / Expnt)) * (np.array([math.cos(x) for x in theta]) + img * (np.array([math.sin(x) for x in theta])))
# take the IFFT
xi = np.fft.ifft(x_phase).real
# --- Overlap and add ---------------
xfinal[k-1:k + len2 - 1] = x_old + xi[0:len1]
x_old = xi[0 + len1:len_]
k = k + len2
# 保存文件
wf = wave.open('outfile.wav', 'wb')
# 設(shè)置參數(shù)
wf.setparams(params)
# 設(shè)置波形文件 .tostring()將array轉(zhuǎn)換為data
wave_data = (winGain * xfinal).astype(np.short)
wf.writeframes(wave_data.tostring())
wf.close()
以上這篇Python譜減法語(yǔ)音降噪實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python3實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字(語(yǔ)音識(shí)別)和文字轉(zhuǎn)語(yǔ)音(語(yǔ)音合成)
- python語(yǔ)音識(shí)別指南終極版(有這一篇足矣)
- 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)
- 基于python實(shí)現(xiàn)語(yǔ)音錄入識(shí)別代碼實(shí)例
- python實(shí)現(xiàn)智能語(yǔ)音天氣預(yù)報(bào)
- Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí)
- python文字轉(zhuǎn)語(yǔ)音實(shí)現(xiàn)過(guò)程解析
- 使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法
- 分析語(yǔ)音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)
相關(guān)文章
Window版下在Jupyter中編寫(xiě)TensorFlow的環(huán)境搭建
這篇文章主要介紹了Window版下在Jupyter中編寫(xiě)TensorFlow的環(huán)境搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python文本轉(zhuǎn)語(yǔ)音引擎pyttsx3的使用完全指南
在開(kāi)發(fā)需要語(yǔ)音輸出功能的應(yīng)用時(shí),文本轉(zhuǎn)語(yǔ)音技術(shù)是一個(gè)非常有用的工具,Python的pyttsx3庫(kù)提供了一個(gè)簡(jiǎn)單且離線的方式來(lái)實(shí)現(xiàn)這一功能,下面小編就來(lái)和大家介紹一下pyttsx3的具體使用吧2025-04-04
研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系
這篇文章主要介紹了研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系,SQLAlchemy庫(kù)是一個(gè)常見(jiàn)的Python中操作數(shù)據(jù)庫(kù)的工具,需要的朋友可以參考下2015-04-04
Python pandas 的索引方式 data.loc[],data[][]示例詳解
這篇文章主要介紹了Python pandas 的索引方式 data.loc[], data[][]的相關(guān)資料,其中data.loc[index,column]使用.loc[ ]第一個(gè)參數(shù)是行索引,第二個(gè)參數(shù)是列索引,本文結(jié)合實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2023-02-02
Python實(shí)現(xiàn)合成多張圖片到PDF格式
在日常生活中,經(jīng)常會(huì)遇到需要提交身份證正反面證明資料的情況,而且這些網(wǎng)站大部分只接受pdf格式,這時(shí)候我們就需要把身份證正反面兩張圖片合成為一個(gè)pdf文件。本文將為大家提供用Python實(shí)現(xiàn)這一要求的方法,需要的可以參考一下2022-02-02
如何基于python實(shí)現(xiàn)年會(huì)抽獎(jiǎng)工具
這篇文章主要介紹了如何基于python實(shí)現(xiàn)年會(huì)抽獎(jiǎng)工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Python RabbitMQ消息隊(duì)列實(shí)現(xiàn)rpc
這篇文章主要介紹了python 之rabbitmq實(shí)現(xiàn)rpc,主要實(shí)現(xiàn)客戶(hù)端通過(guò)發(fā)送命令來(lái)調(diào)用服務(wù)端的某些服務(wù),服務(wù)端把結(jié)果再返回給客戶(hù)端,感興趣的小伙伴們可以參考一下2018-05-05
Python數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)定義與使用方法示例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹(shù)定義與使用方法,結(jié)合具體實(shí)例形式分析了Python哈夫曼樹(shù)的原理、定義及簡(jiǎn)單使用方法,需要的朋友可以參考下2018-04-04
使用wxPython實(shí)現(xiàn)逐行加載HTML內(nèi)容并實(shí)時(shí)顯示效果
這篇博客中,我們將詳細(xì)分析如何使用 wxPython 構(gòu)建一個(gè)簡(jiǎn)單的桌面應(yīng)用程序,用于逐行加載并顯示 HTML 文件的內(nèi)容,并在加載完成后通過(guò)瀏覽器組件呈現(xiàn)最終頁(yè)面,通過(guò)該應(yīng)用,我們可以體驗(yàn)到逐行加載 HTML 內(nèi)容的視覺(jué)效果,類(lèi)似于模擬代碼輸入,需要的朋友可以參考下2024-11-11
TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例
這篇文章主要介紹了TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集的實(shí)現(xiàn)示例的過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11

