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

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

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

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

2582閲覧

音声処理 TypeError: 'int' object is not subscriptable

Kiiki

総合スコア2

Jupyter

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2020/11/27 02:27

音声処理のプログラムについて

以下の任意の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()

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

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

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

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

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

guest

回答1

0

ベストアンサー

あなたがコマンドライン引数のパースに使っているparser.parse_argsのオプション引数argsには、文字列のリストを与える仕様だからです。

parse_args() メソッド

"10"とか"-5"とか、文字列で数値を与えれば、パースが終わった後でcal_adjusted_rmsを呼び出している部分でfloatに変換されて使われるでしょう。

投稿2020/11/27 02:55

Daregada

総合スコア11990

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

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

Kiiki

2020/11/27 03:43

迅速な回答ありがとうございました、納得・解決致しました! ちなみに、今回sn比の設定を0db(上記のプログラム通り)に設定した時は、"0"と指定せずに0でもエラーが出なかったのはどうしてなのでしょうか? もし可能であれば教えて頂きたいです。
Daregada

2020/11/27 04:27 編集

0の代わりにFalseと書いてもエラーが出ないので、おそらく文字列をパースする際に、 if argsの要素:   処理内容 みたいな部分があるのでしょう。argsの要素(文字列を想定)が0やFalseだと、この条件が成立しないので、処理が行なわれず、エラーが発生しないのでしょう。
Kiiki

2020/11/27 14:24

なるほど、処理が行われていなかったということだったのですね。 ご丁寧にありがとうございました、助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問