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

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

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

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

Anaconda

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

Python 3.x

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

Python

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

Q&A

1回答

5699閲覧

ValueError: buffer size must be a multiple of element sizeの解決方法

SSDD

総合スコア11

Jupyter

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

Anaconda

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/11/17 11:32

前提・実現したいこと

def get_args():
parser = argparse.ArgumentParser()
parser.add_argument('--clean_file', type=str, required=True)
parser.add_argument('--noise_file', type=str, required=True)
parser.add_argument('--output_clean_file', type=str, default='')
parser.add_argument('--output_noise_file', type=str, default='')
parser.add_argument('--output_noisy_file', type=str, default='')
parser.add_argument('--snr', type=float, default='', required=True)
args = parser.parse_args(args=['--clean_file',"onsei.wav", '--noise_file', "noise.wav", '--snr',0])
return args

こちらで初期の設定をし、

def cal_amp(wf)の

amptitude = (np.frombuffer(buffer, dtype="int16")).astype(np.float64)

のエラーで以下のメッセージが出ます。こちらのValueErrorについて解決方法含め詳しく教えていただきたいです。

こちらのプログラムは

任意のSignal-to-Noise比の音声波形をPythonで作ろう!
https://engineering.linecorp.com/ja/blog/voice-waveform-arbitrary-signal-to-noise-ratio-python/

音声処理 TypeError: 'int' object is not subscriptable
https://teratail.com/questions/306716
の質問などを参考にしています。

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

ValueError: buffer size must be a multiple of element size

該当のソースコード

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ページで確認できます。

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

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

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

SSDD

2021/11/18 14:34 編集

teratailのヘルプは読んでいませんでした。マルチポストを推奨していないという事を今知りました。お騒がせしてしまい申し訳ありませんでした。
guest

回答1

0

ValueError: buffer size must be a multiple of element size

このエラーメッセージの意味は、buffer が2の倍数になっていない、つまり奇数バイトなので、一次元16ビット整数型のndarrayにすることができないという意味です。

wf.readframes(wf.getnframes())で得られるbytes オブジェクトを偶数であるという前提が間違っているのでしょう。

投稿2021/11/17 11:53

ppaul

総合スコア24666

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

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

SSDD

2021/11/17 12:07

音声処理 TypeError: 'int' object is not subscriptable https://teratail.com/questions/306716 こちらに提示してあるプログラムでは、機能しないのでしょうか。 この文をどう書き替えたらいいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問