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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

2回答

2164閲覧

fPythonの音重ね

2323

総合スコア5

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

2クリップ

投稿2020/07/24 13:56

編集2020/07/25 04:26

###起こっている問題
Pythonでnumpy配列同士を和の演算すると各要素の和になるということらしく表示されるグラフに影響が出てしまいました。それを回避するためにnumpyの何かしらを用いて音データの重ね合わせをしたいです。
song1に10秒の曲データ、song2に1秒のノイズデータがあるとして
song1の5-6秒の1秒間にノイズを重ね合わせて、それを反映させた音を聴けるようにするにはどうすればよいのでしょうか?

###ソースコード
song2_extend = np.zeros_like(song1) #song1と同じサイズの要素0のsong2_extendを用意
song2_extend[5sr:6sr] = song2 #ノイズの音データsong2をsong1の5-6秒に当たる箇所に挿入
mixmusic= song1+song2_extend #元の音データsong1に先ほどのノイズを挿入

print('sampling rate:', sr) #サンプリングレート(周波数)を表示
plt.plot(mixmusic) #完成音データの波形をプロット
IPython.display.Audio(mixmusic, rate=sr) #完成音データを聞ける様に

###song1の波形とsong2のノイズ波形(song1とsong2の最大値は一致させてある)
イメージ説明

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

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

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

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

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

Penpen7

2020/07/24 15:03

ソースコードを貼り付けてください。
2323

2020/07/24 15:09

追記しました、お願いします。
Penpen7

2020/07/24 16:52 編集

ありがとうございます。 以前に同じような質問をされていたかと思いますが、なぜ質問の回答の方法ではなくinsertを使われたのでしょうか? https://teratail.com/questions/274257 重ね合わせの意味を考えますと、要素同士の足し算でいいと思いますが...
2323

2020/07/24 16:56

以前は単純な和の演算で音を合成させて波形と音声を表示させていたのですが、表示したグラフの縦軸:振幅の最大値がノイズ合成前の曲データsong1と比べると増加していたり、振幅値の負の値の成分が減少しており、ノイズ挿入部の波形の位置が上昇していたから、これらを改善したく質問しました。 insertに関しては以前関連する質問をしたときにアドバイスをくださった方がいたからというのが理由です。
2323

2020/07/24 17:02

これが原因かはわかりませんが、この状態でフーリエ変換を経てローパスフィルタをかけると、ノイズ部が明らかに上方向にずれていくという事象が発生しています
Penpen7

2020/07/24 17:10 編集

> 振幅の最大値がノイズ合成前の曲データsong1と比べると増加していたり、振幅値の負の値の成分が減少しており 波を足し合わせているわけですから、波形は変化してもおかしくはないでしょう。振幅を変えたくないのでしょうか? > ノイズ挿入部の波形の位置が上昇 > ノイズ部が明らかに上方向にずれていく 「波形の位置」や「上」がどういう意味での「上」なのかよくわかりませんでした。
2323

2020/07/24 17:24

そうです、song2=ノイズ作成時に意図的にsong1の最大値と一致させたので、合成語の曲データmixmusicではノイズの最大値はそのままの状態で単純にsong1とsong2を合成した形で表示させたいのです。 合成後のmixmusicのノイズが挿入されている5-6秒の箇所の波形が、合成前の曲データsong1と重ねてグラフを表示するとなぜかmixmusicの負の振幅値がsong1の振幅値より振幅値0によっているといったらいいでしょうか…そのような状態です
guest

回答2

0

自己解決

問題があったのは作成したホワイトノイズsong2だった。
###song2(ホワイトノイズ のコード)
time = 1
Srate = 22050

x1=np.linspace(0, time, Srate*time)

y1 = np.random.randn(Srate * time)

y_max=np.max(y)
y1_max = np.max(np.abs(y1))

y_y1= (y1/y1_max)*ans

dataa=y_y1

print('ノイズの最大値:',np.max(np.abs(dataa)))
print('sampling rate:', sr)
plt.plot(dataa)
IPython.display.Audio(dataa, rate=Srate)

###結果
np.random.randn()を用いてノイズを作成し、最終的に曲に合成したら
画像のように表示することができた。
イメージ説明

最終的にはフーリエ変換を経てローパスフィルタをかけることが目的だったため
(ノイズ抑圧シミュレーションをしたかった)
無事にローパスをかけ、逆フーリエ変換することでノイズを抑圧できた。

###ノイズ抑圧前
イメージ説明

###ノイズ抑圧後
イメージ説明

投稿2020/07/25 04:20

2323

総合スコア5

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

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

0

Mixing two audio files together with pythonの回答にて2つの方法が示されています。
単純には0.5倍したものを足し合わせる結果でもよいかと思いますが、結果を聞き比べると違いはあるようです。
以下は1秒目から1秒間だけドにミの音を重ね合わせた例です。

Python

1import numpy as np 2from scipy.io.wavfile import read, write 3from pydub import AudioSegment 4 5Fs = 22100 # サンプリング周波数 6def GenFreq(Fc, dur): 7 Nmax = Fs * dur # サンプル点の総数 8 delta = 1./Fs # サンプリング間隔 9 Amp = 0.5 # 振幅 10 t = np.arange(Nmax) * delta 11 x = Amp * np.sin(2. * np.pi * Fc * t) 12 13 x *= 32767 14 x = x.astype(np.int16) 15 16 return x 17 18# サンプルデータ 19write('do.wav', Fs, GenFreq(262, 5)) 20write('mi.wav', Fs, GenFreq(330, 5)) 21 22# numpyを利用 23_, do = read('do.wav') 24_, mi = read('mi.wav') 25dm = np.copy(do) 26dm[1*Fs:2*Fs] = do[1*Fs:2*Fs] * 0.5 + mi[1*Fs:2*Fs] * 0.5 27write('dm1.wav', Fs, dm) 28 29# pydubを利用 30do = AudioSegment.from_file('do.wav') 31mi = AudioSegment.from_file('mi.wav') 32dm = do[0:1000] + do[1000:2000].overlay(mi[1000:2000]) + do[2000:] 33dm.export('dm2.wav', format='wav')

投稿2020/07/25 00:34

can110

総合スコア38339

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

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

2323

2020/07/25 02:34

ご回答ありがとうございます。私の伝え方が悪くきちんと意味が伝わっていなかったかも しれないので画像と解説を追加しました。ご一読いただければ幸いです。
can110

2020/07/25 02:43

「互いの最大値を超えることなく~そのまま重ねたかのような形」というのがよく理解できません。 回答コードでは0.5倍しているので、互いの最大値を超えることはありません。 具体的な数値または数式などで指摘していただけると助かります。 song1とsong2の同じ位置(重なる)点の値(音の強さ)が「10000」と「20000」だった場合 結果の点の値は「15000」となるべきなのか、それともそれ以外なのか、といった感じです。
2323

2020/07/25 03:00

なかなか言語化が難しく、写真で解説を追加してみました、ご確認していただければ幸いです。
2323

2020/07/25 03:01

音の強さはsong1のものに合わせるといったようにしたいです
2323

2020/07/25 03:02

insertではないものを用いてみましたが、 song2_extend = np.zeros_like(song1) #song1と同じサイズの要素0のsong2_extendを用意 song2_extend[5*sr:6*sr] = song2 #ノイズの音データsong2をsong1の5-6秒に当たる箇所に挿入 mixmusic= song1+song2_extend #元の音データsong1に先ほどのノイズを挿入 print('sampling rate:', sr) #サンプリングレート(周波数)を表示 plt.plot(mixmusic) #完成音データの波形をプロット IPython.display.Audio(mixmusic, rate=sr) #完成音データを聞ける様に
can110

2020/07/25 03:34 編集

そもそもなのですが、回答コードは試していただけているでしょうか? また、試した結果、求める結果とどこがどう違っているのでしょうか?
2323

2020/07/25 04:23

解決できました、御教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問