Python/librosaのピッチシフトで音楽のキーを変更する方法

  • このエントリーをはてなブックマークに追加

音声のピッチ(音程)を変える方法の1つにピッチシフトという方法があります。Pythonのlibrosaというライブラリを使えば数行のコードでピッチシフトを行うことが可能です。ここではサンプルの音楽ファイルを使ってlibrosaのピッチシフトを使う方法を紹介します。

こんにちは。wat(@watlablog)です。ここではlibrosaのピッチシフトを使って音楽のキーを自在に変更する方法を紹介します

ピッチシフトによる音程変更の必要性

音声や音楽のキーを自在に変更できると、某名探偵が持っている変声機の真似事や楽曲の調性をそろえて統一感を出すといった遊びができます。

Advertisements

簡単にピッチ(音程)を変える方法として最初に思い浮かぶのはサンプリング周波数を変更するということでしょう。しかしサンプリング周波数を変えてしまうと、音声全体の長さが変わってしまいます。

そこで、音声全体の時間(テンポ)を変えずにピッチだけを変更する音声処理技術としてピッチシフトPitch shifting)が開発されました。ここでは使ってみることを主目的に置くので、詳細な説明はWikiにお任せします。

Wikipedia:タイムストレッチ/ピッチシフト

動作環境

この記事のコードは以下のPython環境で動作を確認しました。
wavファイルの読み書きにはPySoundFileを使います。librosaにもファイルIOはありますが、どうやら書き込みでエラーになることが多いとのことで慣れているPySoundFileを使ってみます。

Python Python 3.9.6
PyCharm (IDE) PyCharm CE 2020.1
PySoundFile 0.9.0.post1
librosa 0.9.2

librosaによるピッチシフトを行うPythonコード

サンプルファイル

サンプルファイルとして以下の2つを作成しました。筆者の趣味全開ですが、コードの検証にどうぞお使いください。

ピアノ演奏

ショパンのノクターン9-2です。自宅の電子ピアノの音をPCに取り入れたので著作権は筆者watにあるため問題ないはず。

ヴァイオリンの単一音

二つ目はヴァイオリンのA線(ラ音)を開放弦として弾いたものです。こちらはヴァイオリンの趣味を始めた初日に録音したものなのでふらふら音ですが、単一音はコード検証しやすそうだと思い記念に載せておきます。

Pythonコード

ピッチシフトを行うPythonコードはこちらです。驚くほど簡単なコードなのでほぼ説明不要でしょう。「ピッチシフトする」という部分のn_stepsがシフト値になります。1で半音、2で全音です。正負でピッチの上げ下げを表現します。

今回使っているlibrosaのピッチシフトは以下の公式ドキュメントに説明があります。

公式ドキュメント:https://librosa.org/doc/latest/generated/librosa.effects.pitch_shift.html

実行結果

ピアノ演奏のピッチシフト結果

結果はこちらです。半音3つ分下げたノクターンも良い雰囲気出してますね。

音声がどう変わったのか、ピッチシフト前後の音声を繋げて動画にしてみました。

時間波形にしてみると、振幅成分がかなり減衰している(小さくなっている)ことがわかります。耳で聞いてもわかる通り、ピッチシフト処理した後の音はちょっと籠った感じになってしまっています。「Pythonで簡単にwavファイルのノイズキャンセルを行う方法」でも起こったことですが、音声処理をするとどうしても減衰問題に直面しますね。

ヴァイオリン単一音のピッチシフト結果

ヴァイオリンの音は「n_steps=2」で処理してみました。つまりA音は半音2つ上がってB音になるはずです。原音とピッチシフト後の音声ファイルを載せておきます。

A音(原音)
A音を2つピッチシフトしたB音

音の周波数がどう変化したか、音とmatplotlibによる画像で動画を作成しました。ピークが変化しているのがわかると思います。

まとめ

今回はここまで。文量少なめのメモ記事となりましたが、音楽を趣味としている筆者にとって、librosaのピッチシフトには色々な可能性を感じました。ピッチ変更で全体の時間長を変化させたくない時はlibrosaを使いましょう。ただ、少し減衰が大きく働くのは少し難点かもしれません。
librosaには他にもタイムストレッチもできるとのことで、これらを使って楽器ライフを満喫できそうです。

librosaでピッチ(音程)変更が簡単にできました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*