質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1336閲覧

「スペクトラルノイズ除去による雑音除去」による音声再生

SSDD

総合スコア11

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/13 05:48

前提・実現したいこと

「スペクトラルノイズ除去による雑音除去」
https://www.ai-shift.co.jp/techblog/1305

のサイトから、ノイズ部分と音源分離後の音声データを書き込んだ後に
音声を再生したいと思っています。プログラム上だとSound Envelopがノイズ部分、
recovered_signalが音源分離後の音声?のはずです。この2つをwavファイルにすればできると思うのですがその方法を教えてほしいです。

下記のソースコードは、webサイトのプログラムを一部書き加えてあります。

該当のソースコード

python

1!pip install librosa 2 3import numpy as np 4from scipy.ndimage import maximum_filter1d 5 6def envelope(y, rate, threshold): 7 """ 8 Args: 9 - y: 信号データ 10 - rate: サンプリング周波数 11 - threshold: 雑音判断するしきい値 12 Returns: 13 - mask: 振幅がしきい値以上か否か 14 - y_mean: Sound Envelop 15 """ 16 y_mean = maximum_filter1d(np.abs(y), mode="constant", size=rate//20) 17 mask = [mean > threshold for mean in y_mean] 18 return mask, y_mean 19 20import librosa 21 22 23n_fft=2048 # STFTカラム間の音声フレーム数 24hop_length=512 # STFTカラム間の音声フレーム数 25win_length=2048 # ウィンドウサイズ 26n_std_thresh=1.5 # 信号とみなされるために、ノイズの平均値よりも大きい標準偏差(各周波数レベルでの平均値のdB)が何個あるかのしきい値 27 28def _stft(y, n_fft, hop_length, win_length): 29 return librosa.stft(y=y, n_fft=n_fft, hop_length=hop_length, win_length=win_length) 30 31def _amp_to_db(x): 32 return librosa.core.amplitude_to_db(x, ref=1.0, amin=1e-20, top_db=80.0) 33 34 35 36sample_rate= 32000 37 38# 音声ファイルの読み込み 39#noise_clip = open(r"C:\Users\1818067\birdvoice.wav") 40 41path=r'C:\Users\1818067\birdvoice.wav' 42sig, _ = librosa.load(path, sr=sample_rate) 43 44# ノイズデータ取得 45mask, noise_clip = envelope(sig, sample_rate, threshold=0.03) 46 47 48 49 50noise_stft = _stft(noise_clip, n_fft, hop_length, win_length) 51noise_stft_db = _amp_to_db(np.abs(noise_stft)) # dBに変換する 52 53mean_freq_noise = np.mean(noise_stft_db, axis=1) 54std_freq_noise = np.std(noise_stft_db, axis=1) 55noise_thresh = mean_freq_noise + std_freq_noise * n_std_thresh 56 57import librosa 58from envelop import envelope 59import scipy 60 61 62n_grad_freq = 2 # マスクで平滑化する周波数チャンネルの数 63n_grad_time = 4 # マスクを使って滑らかにする時間チャンネル数 64prop_decrease = 1.0 # ノイズをどの程度減らすか 65 66 67#data = open(r'C:\Users\1818067\birdvoice.wav') 68#audio_clip = envelope(data).envelop 69 70sample_rate= 32000 71 72# 音声ファイルの読み込み 73#noise_clip = open(r"C:\Users\1818067\birdvoice.wav") 74 75path=r'C:\Users\1818067\birdvoice.wav' 76sig, _ = librosa.load(path, sr=sample_rate) 77 78# ノイズデータ取得 79audio_clip, rate = librosa.load('birdvoice.wav') 80 81 82# 音源もSTFTで特徴量抽出する 83sig_stft = _stft(audio_clip, n_fft, hop_length, win_length) 84sig_stft_db = _amp_to_db(np.abs(sig_stft)) 85 86# 時間と頻度でマスクの平滑化フィルターを作成 87smoothing_filter = np.outer( 88 np.concatenate( 89 [ 90 np.linspace(0, 1, n_grad_freq + 1, endpoint=False), 91 np.linspace(1, 0, n_grad_freq + 2), 92 ] 93 )[1:-1], 94 np.concatenate( 95 [ 96 np.linspace(0, 1, n_grad_time + 1, endpoint=False), 97 np.linspace(1, 0, n_grad_time + 2), 98 ] 99 )[1:-1], 100 ) 101smoothing_filter = smoothing_filter / np.sum(smoothing_filter) 102 103# 時間と周波数のしきい値の計算 104db_thresh = np.repeat( 105 np.reshape(noise_thresh, [1, len(mean_freq_noise)]), 106 np.shape(sig_stft_db)[1], 107 axis=0, 108 ).T 109sig_mask = sig_stft_db < db_thresh 110sig_mask = scipy.signal.fftconvolve(sig_mask, smoothing_filter, mode="same") 111sig_mask = sig_mask * prop_decrease 112 113mask_gain_dB = np.min(_amp_to_db(np.abs(sig_stft))) 114 115def _db_to_amp(x,): 116 return librosa.core.db_to_amplitude(x, ref=1.0) 117 118sig_stft_db_masked = ( 119 sig_stft_db * (1 - sig_mask) 120 + np.ones(np.shape(mask_gain_dB)) * mask_gain_dB * sig_mask 121) 122 123def _istft(y, hop_length, win_length): 124 return librosa.istft(y, hop_length, win_length) 125 126sig_imag_masked = np.imag(sig_stft) * (1 - sig_mask) 127sig_stft_amp = (_db_to_amp(sig_stft_db_masked) * np.sign(sig_stft)) + (1j * sig_imag_masked) 128 129recovered_signal = _istft(sig_stft_amp, hop_length, win_length) 130

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問