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

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

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

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

Q&A

解決済

1回答

2263閲覧

ビームフォーミング法を用いた音源分離について

SSDD

総合スコア11

Python

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

0グッド

0クリップ

投稿2021/07/19 11:08

問題点

FileNotFoundErrorとなっているので単純にファイルの生成ができていないのかと思いました。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-12-ecebe78d8dc4> in <module> 92 #ファイルを読み込む 93 for clean_wave_file in clean_wave_files: ---> 94 wav=wave.open(clean_wave_file) 95 if n_samples<wav.getnframes(): 96 n_samples=wav.getnframes() ~\anaconda3\lib\wave.py in open(f, mode) 508 mode = 'rb' 509 if mode in ('r', 'rb'): --> 510 return Wave_read(f) 511 elif mode in ('w', 'wb'): 512 return Wave_write(f) ~\anaconda3\lib\wave.py in __init__(self, f) 158 self._i_opened_the_file = None 159 if isinstance(f, str): --> 160 f = builtins.open(f, 'rb') 161 self._i_opened_the_file = f 162 # else, assume it is an open file object already FileNotFoundError: [Errno 2] No such file or directory: './CMU_ARCTIC/cmu_us_aew_arctic/wav/arctic_a0001.wav'

該当のソースコード

python

1import wave as wave 2import pyroomacoustics as pa 3import numpy as np 4import scipy.signal as sp 5 6#ステアリングベクトルを算出 7#mic_position: 3 x M dimensional ndarray [[x,y,z],[x,y,z]] 8#source_position: 3x Ns dimensional ndarray [[x,y,z],[x,y,z] ] 9#freqs: Nk dimensional array [f1,f2,f3...] 10#sound_speed: 音速 [m/s] 11#is_use_far: Farを使う場合はTrue, Nearの場合はFalse, 12#return: steering vector (Nk x Ns x M) 13def calculate_steering_vector(mic_alignments,source_locations,freqs,sound_speed=340,is_use_far=False): 14 #マイク数を取得 15 n_channels=np.shape(mic_alignments)[1] 16 17 #音源数を取得 18 n_source=np.shape(source_locations)[1] 19 20 if is_use_far==True: 21 #音源位置を正規化 22 norm_source_locations=source_locations/np.linalg.norm(source_locations,2,axis=0,keepdims=True) 23 24 #位相を求める 25 steering_phase=np.einsum('k,ism,ism->ksm',2.j*np.pi/sound_speed*freqs,norm_source_locations[...,None],mic_alignments[:,None,:]) 26 27 #ステアリングベクトルを算出 28 steering_vector=1./np.sqrt(n_channels)*np.exp(steering_phase) 29 30 return(steering_vector) 31 32 else: 33 34 #音源とマイクの距離を求める 35 #distance: Ns x Nm 36 distance=np.sqrt(np.sum(np.square(source_locations[...,None]-mic_alignments[:,None,:]),axis=0)) 37 38 #遅延時間(delay) [sec] 39 delay=distance/sound_speed 40 41 #ステアリングベクトルの位相を求める 42 steering_phase=np.einsum('k,sm->ksm',-2.j*np.pi*freqs,delay) 43 44 #音量の減衰 45 steering_decay_ratio=1./distance 46 47 #ステアリングベクトルを求める 48 steering_vector=steering_decay_ratio[None,...]*np.exp(steering_phase) 49 50 #大きさを1で正規化する 51 steering_vector=steering_vector/np.linalg.norm(steering_vector,2,axis=2,keepdims=True) 52 53 return(steering_vector) 54 55#2バイトに変換してファイルに保存 56#signal: time-domain 1d array (float) 57#file_name: 出力先のファイル名 58#sample_rate: サンプリングレート 59def write_file_from_time_signal(signal,file_name,sample_rate): 60 #2バイトのデータに変換 61 signal=signal.astype(np.int16) 62 63 #waveファイルに書き込む 64 wave_out = wave.open(file_name, 'w') 65 66 #モノラル:1、ステレオ:2 67 wave_out.setnchannels(1) 68 69 #サンプルサイズ2byte 70 wave_out.setsampwidth(2) 71 72 #サンプリング周波数 73 wave_out.setframerate(sample_rate) 74 75 #データを書き込み 76 wave_out.writeframes(signal) 77 78 #ファイルを閉じる 79 wave_out.close() 80 81#乱数の種を初期化 82np.random.seed(0) 83 84#畳み込みに用いる音声波形 85clean_wave_files=["./CMU_ARCTIC/cmu_us_aew_arctic/wav/arctic_a0001.wav"] 86 87#音源数 88n_sources=len(clean_wave_files) 89 90#長さを調べる 91n_samples=0 92#ファイルを読み込む 93for clean_wave_file in clean_wave_files: 94 wav=wave.open(clean_wave_file) 95 if n_samples<wav.getnframes(): 96 n_samples=wav.getnframes() 97 wav.close() 98 99clean_data=np.zeros([n_sources,n_samples]) 100 101#ファイルを読み込む 102s=0 103for clean_wave_file in clean_wave_files: 104 wav=wave.open(clean_wave_file) 105 data=wav.readframes(wav.getnframes()) 106 data=np.frombuffer(data, dtype=np.int16) 107 data=data/np.iinfo(np.int16).max 108 clean_data[s,:wav.getnframes()]=data 109 wav.close() 110 s=s+1 111# シミュレーションのパラメータ 112 113#サンプリング周波数 114sample_rate=16000 115 116#フレームサイズ 117N=1024 118 119#周波数の数 120Nk=N/2+1 121 122#各ビンの周波数 123freqs=np.arange(0,Nk,1)*sample_rate/N 124 125#音声と雑音との比率 [dB] 126SNR=20. 127 128#部屋の大きさ 129room_dim = np.r_[10.0, 10.0, 10.0] 130 131#マイクロホンアレイを置く部屋の場所 132mic_array_loc = room_dim / 2 + np.random.randn(3) * 0.1 133 134#マイクロホンアレイのマイク配置 135mic_alignments = np.array( 136 [ 137 [-0.01, 0.0, 0.0], 138 [0.01, 0.0, 0.0], 139 ] 140) 141 142#マイクロホン数 143n_channels=np.shape(mic_alignments)[0] 144 145#マイクロホンアレイの座標 146R=mic_alignments .T+mic_array_loc[:,None] 147 148# 部屋を生成する 149room = pa.ShoeBox(room_dim, fs=sample_rate, max_order=0) 150 151# 用いるマイクロホンアレイの情報を設定する 152room.add_microphone_array(pa.MicrophoneArray(R, fs=room.fs)) 153 154#音源の場所 155doas=np.array( 156 [[np.pi/2., 0] 157 ] ) 158 159#音源とマイクロホンの距離 160distance=1. 161source_locations=np.zeros((3, doas.shape[0]), dtype=doas.dtype) 162source_locations[0, :] = np.cos(doas[:, 1]) * np.sin(doas[:, 0]) 163source_locations[1, :] = np.sin(doas[:, 1]) * np.sin(doas[:, 0]) 164source_locations[2, :] = np.cos(doas[:, 0]) 165source_locations *= distance 166source_locations += mic_array_loc[:, None] 167 168#各音源をシミュレーションに追加する 169for s in range(n_sources): 170 clean_data[s]/= np.std(clean_data[s]) 171 room.add_source(source_locations[:, s], signal=clean_data[s]) 172 173#シミュレーションを回す 174room.simulate(snr=SNR) 175 176#畳み込んだ波形を取得する(チャンネル、サンプル) 177multi_conv_data=room.mic_array.signals 178 179 180#畳み込んだ波形をファイルに書き込む 181write_file_from_time_signal(multi_conv_data[0]*np.iinfo(np.int16).max/20.,"./mix_in.wav",sample_rate) 182 183#Near仮定に基づくステアリングベクトルを計算: steering_vectors(Nk x Ns x M) 184near_steering_vectors=calculate_steering_vector(R,source_locations,freqs,is_use_far=False) 185 186#短時間フーリエ変換を行う 187f,t,stft_data=sp.stft(multi_conv_data,fs=sample_rate,window="hann",nperseg=N) 188 189#遅延和アレイを実行する 190s_hat=np.einsum("ksm,mkt->skt",np.conjugate(near_steering_vectors),stft_data) 191 192#ステアリングベクトルをかける 193c_hat=np.einsum("skt,ksm->mskt",s_hat,near_steering_vectors) 194 195#時間領域の波形に戻す 196t,ds_out=sp.istft(c_hat[0],fs=sample_rate,window="hann",nperseg=N) 197 198#大きさを調整する 199ds_out=ds_out*np.iinfo(np.int16).max/20. 200 201#ファイルに書き込む 202write_file_from_time_signal(ds_out,"./ds_out.wav",sample_rate) 203

補足情報(FW/ツールのバージョンなど)

これは、Pythonで学ぶ音源分離という参考書の第6章ソースコードから取りました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下を実行して、カレントディレクトリを確認してください。
その中に、
CMU_ARCTIC/cmu_us_aew_arctic/wav/arctic_a0001.wav
はありますか?

python

1import os 2print(os.getcwd()) 3

投稿2021/07/19 11:20

ppaul

総合スコア24670

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

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

SSDD

2021/07/20 12:20

回答ありがとうございます。 そちらの実行結果でC:/Users/"ユーザファイル"となりました。(ユーザファイル名は伏せさせていただきます) また、そのユーザファイル内にCMU_ARCTIC/cmu_us_aew_arctic/wav/arctic_a0001.wav はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問