web-dev-qa-db-ja.com

Python wavファイルのピッチを変更

生のオーディオデータ処理なしでwavファイルのピッチを変更するには、pythonライブラリが必要です。それを見つけるために数時間を費やしましたが、奇妙な生のデータ処理コードスニペットとビデオしか見つかりませんでした。リアルタイムのピッチシフトを示していますが、ソースコードはありません。

12

wavファイルは基本的にis生のオーディオデータなので、ピッチを変更することはできませんなし "生のオーディオ処理"。

これがあなたができることです。 wave(標準ライブラリ)およびnumpyモジュールが必要です。

import wave
import numpy as np

ファイルを開きます。

wr = wave.open('input.wav', 'r')
# Set the parameters for the output file.
par = list(wr.getparams())
par[3] = 0  # The number of samples will be set by writeframes.
par = Tuple(par)
ww = wave.open('pitch1.wav', 'w')
ww.setparams(par)

音はほんの一瞬で処理されます。これはリバーブを削減します。 frを1に設定してみてください。迷惑なエコーが聞こえます。

fr = 20
sz = wr.getframerate()//fr  # Read and process 1/fr second at a time.
# A larger number for fr means less reverb.
c = int(wr.getnframes()/sz)  # count of the whole file
shift = 100//fr  # shifting 100 Hz
for num in range(c):

データを読み取り、左右のチャネルに分割します(ステレオWAVファイルを想定)。

    da = np.fromstring(wr.readframes(sz), dtype=np.int16)
    left, right = da[0::2], da[1::2]  # left and right channel

Numpyに組み込まれた高速フーリエ変換を使用して周波数を抽出します。

    lf, rf = np.fft.rfft(left), np.fft.rfft(right)

ピッチを上げるには、アレイを回転させます。

    lf, rf = np.roll(lf, shift), np.roll(rf, shift)

最高周波数は最低周波数にロールオーバーします。それは私たちが望むものではないので、それらをゼロにします。

    lf[0:shift], rf[0:shift] = 0, 0

次に、逆フーリエ変換を使用して、信号を振幅に変換し直します。

    nl, nr = np.fft.irfft(lf), np.fft.irfft(rf)

2つのチャネルを結合します。

    ns = np.column_stack((nl, nr)).ravel().astype(np.int16)

出力データを書き込みます。

    ww.writeframes(ns.tostring())

すべてのフレームが処理されたら、ファイルを閉じます。

wr.close()
ww.close()
8
Roland Smith

pydub を試して、オーディオファイル全体およびさまざまな形式(wav、mp3など)ですばやく簡単にピッチを変更できます。

これが動作するコードです。 ここ からのインスピレーションとピッチ変更の詳細については ここ を参照してください。

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_file('in.wav', format="wav")

# shift the pitch up by half an octave (speed will increase proportionally)
octaves = 0.5

new_sample_rate = int(sound.frame_rate * (2.0 ** octaves))

# keep the same samples but tell the computer they ought to be played at the 
# new, higher sample rate. This file sounds like a chipmunk but has a weird sample rate.
hipitch_sound = sound._spawn(sound.raw_data, overrides={'frame_rate': new_sample_rate})

# now we just convert it to a common sample rate (44.1k - standard audio CD) to 
# make sure it works in regular audio players. Other than potentially losing audio quality (if
# you set it too low - 44.1k is plenty) this should now noticeable change how the audio sounds.
hipitch_sound = hipitch_sound.set_frame_rate(44100)

#Play pitch changed sound
play(hipitch_sound)

#export / save pitch changed sound
hipitch_sound.export("out.wav", format="wav")
5
Anil_M

Librosaのピッチシフト機能を試すことをお勧めします: https://librosa.github.io/librosa/generated/librosa.effects.pitch_shift.html

import librosa
y, sr = librosa.load('your_file.wav', sr=16000) # y is a numpy array of the wav file, sr = sample rate
y_shifted = librosa.effects.pitch_shift(y, sr, n_steps=4) # shifted by 4 half steps
3
Nic Scozzaro