torchaudioのチュートリアル、pytorchで音声を扱う3

torchaudioのチュートリアルの3回目です。オーディオへのエフェクト等、色々できるみたいです。

torchaudioのチュートリアルは、オーディオの前処理についてがメイントピックだったね。

torchaudioのチュートリアルの三回目です。今回は、torchaudioの「functional」という機能についてのチュートリアルとなります。Functionalは、波形に対して効果を付け加えたり、また、前回のtransformationsと一部重なる機能が実装されているみたいです。

ぱんだクリップ
torchaudioのチュートリアル、pytorchで音声を扱う2 | ぱんだクリップ 引き続きtorchaudioについて勉強しています。音声は色々な周辺知識が必要ですね。 規格とかそういうものが多そうな気がするね。 前回に引き続き、torchaudioのチュートリア...

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・torchaudioのチュートリアルをやっている人

・PyTorchで音声を操作したい人

目次

Functionalについて

これからみていく「Functional」は、「transformations」と一部重なる処理もできるとのことです。また、「Functinoal」には、フィルター機能など、波形にエフェクトを与えるような機能もあるようです。

「Functional」の機能一覧はこちらで確認できます。

あわせて読みたい

まずは「functional」をつかってμLowエンコーディング化を行ってみます。

FunctionalでμLowエンコーディング

mu_law_encoding_waveform = torchaudio.functional.mu_law_encoding(waveform, quantization_channels=256)

print("Shape of transformed waveform: {}".format(mu_law_encoding_waveform.size()))

plt.figure()
plt.plot(mu_law_encoding_waveform[0,:].numpy())
Shape of transformed waveform: torch.Size([2, 264600])
[<matplotlib.lines.Line2D at 0x7f573b584a58>]

以前のチュートリアルで勉強した、「torchaudio.transforms.MuLawEncoding」と同じようにμLowエンコーディングに変換できています。

スペクトログラム

次に、スペクトログラムを「Functional」を利用して表示させてみます。

computed = torchaudio.functional.compute_deltas(specgram.contiguous(), win_length=3)
print("Shape of computed deltas: {}".format(computed.shape))

plt.figure()
plt.imshow(computed.log2()[0,:,:].detach().numpy(), cmap='gray')
Shape of computed deltas: torch.Size([2, 128, 1324])
<matplotlib.image.AxesImage at 0x7f573b4e5940>

チュートリアルをそのまま実行しても、スペクトログラムが表示されませんでした^^;

ここは、よくわからなかった点です。

Functionalのエフェクト

勝手にエフェクト、と名付けてしまいましたが、波形自体を変更してしまう系の操作ということでエフェクトと呼んでみました。

ゲイン、ディザー処理

チュートリアルでは、「ゲイン」「ディザー」「フィルター」が紹介されています。

「ゲイン」は、デシベル単位で音量を上げることができるようです。

また、「ディザー」は、波形にディザー処理を行うことができるようです。ディザーは、ビットレート(24bit→16bitなど)を変更したときに端数となるような誤差から不自然な歪みが生まれないようにするための処理です。次のプログラムのように、簡単に実行することができるようです。

print("オリジナル波形")
print("Min of waveform: {}\nMax of waveform: {}\nMean of waveform: {}".format(waveform.min(), waveform.max(), waveform.mean()))

gain_waveform = torchaudio.functional.gain(waveform, gain_db=5.0)
print("ゲイン")
print("Min of gain_waveform: {}\nMax of gain_waveform: {}\nMean of gain_waveform: {}".format(gain_waveform.min(), gain_waveform.max(), gain_waveform.mean()))

dither_waveform = torchaudio.functional.dither(waveform)
print("ディザー")
print("Min of dither_waveform: {}\nMax of dither_waveform: {}\nMean of dither_waveform: {}".format(dither_waveform.min(), dither_waveform.max(), dither_waveform.mean()))
オリジナル波形
Min of waveform: -0.988525390625
Max of waveform: 0.804107666015625
Mean of waveform: -1.839133801695425e-05
ゲイン
Min of gain_waveform: -1.7578743696212769
Max of gain_waveform: 1.4299280643463135
Mean of gain_waveform: -3.27050693158526e-05
ディザー
Min of dither_waveform: -0.98846435546875
Max of dither_waveform: 0.8040771484375
Mean of dither_waveform: -4.223213181830943e-06

フィルター

次に、波形にフィルターをかけてみます。 まずはカットオフ周波数3khzのローパスフィルターです。

表示が周波数表示ではないので、正直わかりにくいのですが^^;

lowpass_waveform = torchaudio.functional.lowpass_biquad(waveform, sample_rate, cutoff_freq=3000)

print("Min of lowpass_waveform: {}\nMax of lowpass_waveform: {}\nMean of lowpass_waveform: {}".format(lowpass_waveform.min(), lowpass_waveform.max(), lowpass_waveform.mean()))

plt.figure()
plt.plot(lowpass_waveform.t().numpy())
Min of lowpass_waveform: -0.739441990852356
Max of lowpass_waveform: 0.7641644477844238
Mean of lowpass_waveform: -1.839107062551193e-05
[<matplotlib.lines.Line2D at 0x7f32346b96a0>,
 <matplotlib.lines.Line2D at 0x7f32346b97b8>]
次に、ハイパスフィルターです。2khzでカットオフしているので、結構音量も下がっているのが確認できました。いい感じにスカスカな波形になったと思います。
highpass_waveform = torchaudio.functional.highpass_biquad(waveform, sample_rate, cutoff_freq=2000)

print("Min of highpass_waveform: {}\nMax of highpass_waveform: {}\nMean of highpass_waveform: {}".format(highpass_waveform.min(), highpass_waveform.max(), highpass_waveform.mean()))

plt.figure()
plt.plot(highpass_waveform.t().numpy())
Min of highpass_waveform: -0.5754531621932983
Max of highpass_waveform: 0.4910738170146942
Mean of highpass_waveform: -1.121222142907996e-10
[<matplotlib.lines.Line2D at 0x7f32346a9198>,
 <matplotlib.lines.Line2D at 0x7f32346a92b0>]

その他、kaldiとの連携

チュートリアルでは、Kaldiという音声認識エンジンとの連携で、torchaudioとスムーズにデータを受け渡しできるような内容が記載されていました。kaldiには、「DNN(ディープニューラルネットワーク)」が採用されているらしく、機械学習とは何かしらのつながりがあるようですが、私はまだ利用したことがないので、ここはさっと眺める程度にしました。

torchaudioのチュートリアルとしては、音声のデータを変換することで、データの前処理に利用できる便利な機能群という理解が得られました。

実際、音声を機械学習するときはどんなアルゴリズムを利用したらいいのか、そういったところまで調査していきたいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次