音声処理のプログラムについて
以下の任意のSN比の音声ファイルを作成するプログラムの中で、snrの指定を0dBにした場合は実行できるのですが、それ以外の値(例:10dB, -5dBなど)を指定しようとすると、
[TypeError: 'int' object is not subscriptable]
とエラーが出てしまい実行できません。
どうしてでしょうか、ご存知の方ご教授いただけますと幸いです。
(ちなみにAnacondaを使用して実行しようとしています。)
python
1import argparse 2import array 3import math 4import numpy as np 5import random 6import wave 7 8 9def get_args(): 10 parser = argparse.ArgumentParser() 11 parser.add_argument('--clean_file', type=str, required=True) 12 parser.add_argument('--noise_file', type=str, required=True) 13 parser.add_argument('--output_clean_file', type=str, default='') 14 parser.add_argument('--output_noise_file', type=str, default='') 15 parser.add_argument('--output_noisy_file', type=str, default='', required=True) 16 parser.add_argument('--snr', type=float, default='', required=True) 17 18 args = parser.parse_args(args=['--clean_file',"sample.wav", '--noise_file', "noise.wav", '--output_clean_file',"clear.wav",'--output_noise_file',"noise.wav",'--output_noisy_file',"noisy.wav",'--snr',0]) 19 return args 20 21 22def cal_adjusted_rms(clean_rms, snr): 23 a = float(snr) / 20 24 noise_rms = clean_rms / (10**a) 25 return noise_rms 26 27 28def cal_amp(wf): 29 buffer = wf.readframes(wf.getnframes()) 30 amptitude = (np.frombuffer(buffer, dtype="int16")).astype(np.float64) 31 return amptitude 32 33 34def cal_rms(amp): 35 return np.sqrt(np.mean(np.square(amp), axis=-1)) 36 37 38if __name__ == '__main__': 39 40 args = get_args() 41 clean_file = args.clean_file 42 noise_file = args.noise_file 43 snr = args.snr 44 45 clean_wav = wave.open(clean_file, "r") 46 noise_wav = wave.open(noise_file, "r") 47 48 clean_amp = cal_amp(clean_wav) 49 noise_amp = cal_amp(noise_wav) 50 51 start = random.randint(0, len(noise_amp)-len(clean_amp)) 52 clean_rms = cal_rms(clean_amp) 53 split_noise_amp = noise_amp[start: start + len(clean_amp)] 54 noise_rms = cal_rms(split_noise_amp) 55 56 adjusted_noise_rms = cal_adjusted_rms(clean_rms, snr) 57 58 adjusted_noise_amp = split_noise_amp * (adjusted_noise_rms / noise_rms) 59 mixed_amp = (clean_amp + adjusted_noise_amp) 60 61 62 if (mixed_amp.max(axis=0) > 32767): 63 mixed_amp = mixed_amp * (32767/mixed_amp.max(axis=0)) 64 clean_amp = clean_amp * (32767/mixed_amp.max(axis=0)) 65 adjusted_noise_amp = adjusted_noise_amp * (32767/mixed_amp.max(axis=0)) 66 67 68 noisy_wave = wave.Wave_write(args.output_noisy_file) 69 noisy_wave.setparams(clean_wav.getparams()) 70 noisy_wave.writeframes(array.array('h', mixed_amp.astype(np.int16)).tostring() ) 71 noisy_wave.close() 72 73 74 clean_wave = wave.Wave_write(args.output_clean_file) 75 clean_wave.setparams(clean_wav.getparams()) 76 clean_wave.writeframes(array.array('h', clean_amp.astype(np.int16)).tostring() ) 77 clean_wave.close() 78 79 80 noise_wave = wave.Wave_write(args.output_noise_file) 81 noise_wave.setparams(clean_wav.getparams()) 82 noise_wave.writeframes(array.array('h', adjusted_noise_amp.astype(np.int16)).tostring() ) 83 noise_wave.close()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/27 03:43
2020/11/27 04:27 編集
2020/11/27 14:24