pythonで再生時間や音量を変えずに周波数を変更したい

実現したいこと

google colabで読み込んだ音声データの再生時間や音量を変えずに周波数を倍にしたりして音程を変えたい

発生している問題・分からないこと

chatgptを使ってまず再生時間や音量を変えずに周波数を二倍にできるか実現できるか試してみましたが、
・周波数の値を二倍にする編集→音程が変わらない
・音声データを細かく分け、それぞれ編集できるまでループさせた後再生速度を二倍にして、その後細かく分けた時と同じ再生時間になるように切り取り、繋げる編集→音程が変わらない
・librosaを使って音程を上げる→音声データの中間の音量だけ減衰するので音量を元に戻せない
となったり、そもそもエラーを直せなかったりしたのでどうすれば再生時間や音量を変えずに周波数を変えれるのか知りたいです。

該当のソースコード

python

1#細かく分ける編集で最後にできたプログラム2import numpy as np 3from pydub import AudioSegment 4import matplotlib.pyplot as plt 5 6# 音声データの読み込み7audio_file_path = '/content/drive/MyDrive/maou_se_inst_piano2_6ra.mp3' # ファイルパスを指定8audio = AudioSegment.from_mp3(audio_file_path)9 10# パラメータ設定11overlap_ratio = 0.512window_size = int(0.001 * audio.frame_rate)13# 窓関数のサイズを奇数に変更14window_size = window_size + 1 if window_size % 2 == 0 else window_size 15hop_size = int(window_size * (1 - overlap_ratio))16playback_speed = 2.017 18# 窓関数の適用19num_frames = int(np.ceil(len(audio) / hop_size))20frames = [21 np.array(audio.get_array_of_samples()[i * hop_size:(i * hop_size) + window_size], dtype=np.int32) * np.hanning(window_size)22 for i in range(num_frames)23]24 25# 再生速度の変更と切り取り26edited_frames = [27 AudioSegment(28 data=frame.tobytes(),29 sample_width=frame.dtype.itemsize,30 frame_rate=int(audio.frame_rate/playback_speed),31 channels=132 )33 for frame in frames 34]35 36# グラフの描画37time_axis_original = np.linspace(0, len(audio) / 1000, len(audio.get_array_of_samples()))38time_axis_edited = np.linspace(0, len(edited_frames) / (playback_speed * 1000), sum(len(frame.get_array_of_samples()) for frame in edited_frames))39plt.plot(time_axis_original, audio.get_array_of_samples().astype(np.int32))40plt.plot(time_axis_edited, np.concatenate([frame.get_array_of_samples() for frame in edited_frames]))41plt.xlabel('Time (seconds)')42plt.ylabel('Amplitude')43plt.legend(['Original', 'Edited'])44plt.title('Comparison of Original and Edited Audio')45plt.show()46 47# 編集後の音声データの書き出し(wavファイル)48edited_audio = AudioSegment.from_mono_audiosegments(*edited_frames)49edited_audio.export('output.wav', format='wav') # 出力ファイル名を指定50 51このプログラムでは 52 53KeyError Traceback (most recent call last)54<ipython-input-96-3f361ea0a65e> in <cell line: 37>()55 35 # グラフの描画56 36 time_axis_original = np.linspace(0, len(audio) / 1000, len(audio.get_array_of_samples()))57---> 37 time_axis_edited = np.linspace(0, len(edited_frames) / (playback_speed * 1000), sum(len(frame.get_array_of_samples()) for frame in edited_frames))58 38 plt.plot(time_axis_original, audio.get_array_of_samples())59 39 plt.plot(time_axis_edited, np.concatenate([frame.get_array_of_samples() for frame in edited_frames]))60 61 62 633 frames 64 65<ipython-input-96-3f361ea0a65e> in <genexpr>(.0)66 35 # グラフの描画67 36 time_axis_original = np.linspace(0, len(audio) / 1000, len(audio.get_array_of_samples()))68---> 37 time_axis_edited = np.linspace(0, len(edited_frames) / (playback_speed * 1000), sum(len(frame.get_array_of_samples()) for frame in edited_frames))69 38 plt.plot(time_axis_original, audio.get_array_of_samples())70 39 plt.plot(time_axis_edited, np.concatenate([frame.get_array_of_samples() for frame in edited_frames]))71 72/usr/local/lib/python3.10/dist-packages/pydub/audio_segment.py in get_array_of_samples(self, array_type_override)73 270 """ 74 271 if array_type_override is None:75--> 272 array_type_override = self.array_type 76 273 return array.array(array_type_override, self._data)77 274 78 79/usr/local/lib/python3.10/dist-packages/pydub/audio_segment.py in array_type(self)80 275 @property81 276 def array_type(self):82--> 277 return get_array_type(self.sample_width * 8)83 278 84 279 def __len__(self):85 86/usr/local/lib/python3.10/dist-packages/pydub/utils.py in get_array_type(bit_depth, signed)87 41 88 42 def get_array_type(bit_depth, signed=True):89---> 43 t = ARRAY_TYPES[bit_depth]90 44 if not signed:91 45 t = t.upper()92 93KeyError: 6494というエラーが出たまま直せませんでした 95

試したこと・調べたこと

上記の詳細・結果

pythonで周波数を変更する方法を調べてみましたが、古かったりして再現することができませんでした。

補足

python3.10.12
numpy1.23.5
matplotlib3.7.1
soundfile0.12.1

コメントを投稿

0 コメント