【spleeter】ボーカル音源からアーティスト分類器の作成してみた【python×SVM】

機械学習や深層学習の普及と共に、音声認識に関連したアプリケーションやオープンソースソフトウェアを目にする機会が多くなりました。

例えば、Google社が提供する「Speech-to-Text」では、音声データから人間の声を自動的に認識し、文字にリアルタイムに変換することが可能です。この「Speech-to-Text」を使用した活用事例としては、議事録の文字おこしや、音声による執筆活動があります。Youtubeの自動字幕機能も同様の技術が使用されていると思います。

また、以前こちらの記事で紹介したDeezer社が提供する「Spleeter」では、音声データから人間の声と楽器隊の演奏を識別し、音源データを分離することが可能です。音声認識においては、音声データの事前処理が非常に重要となります。目的の音声以外の音がデータに入っていては、音声認識の精度が落ちることは自明ですよね。この「Spleeter」を使用すると、面倒な事前処理が効率化できるため、音声認識への参入障壁が下がり、実用化や研究が盛んになることが期待できます。

上記の事例以外にも話者認識という技術を用いて、声を発した人物が誰なのかを特定する研究も盛んに行われており、バイオメトリクス認証の分野では既に実用化レベルまで来ているそうです。

前置きはここまでとして、具体的な音声認識の技術や活用事例を調査していく中で、筆者がふと思ったのが「話し声ではなく歌声でも同様のことが可能なのか」ということです。歌声から文字おこしをすることができれば好きな楽曲の歌詞をわざわざ調べることなく、音楽を聴きながら歌詞をリアルタイムに表示することができます。

ラジオや街中で流れてきた楽曲を家に帰ってから歌詞を頼りに検索した経験は誰しもがあると思います。歌声からアーティストを特定することができれば、誰が歌っているのかその場で直ぐに分かり、帰宅までのモヤモヤが解消されるでしょう。

しかし、この「歌声をもとに音声認識する」事例を調べても実用化したという例をなかなか見つけることができません。実際にYoutubeの自動字幕機能に関しても歌声には対応できていないのか、歌詞が正確に表示されることはありません。「歌声をもとに音声認識する」ということには潜在的に大きな課題があるのかもしれません。

この記事では、音声認識の大まかなイメージをつかむことと、「歌声をもとに音声認識する」ことが実際に可能なのかを明らかにするために、「ボーカル音源からアーティスト分類器を作成」した際の備忘録を残します。私と同様に音楽が好きで、音声認識に興味のある方の参考になれば幸いです。

広告

 

 

動作確認済み環境


OS: Windows 10 Home (64bit)
CPU: Intel Core i7-9750H
pythonパッケージ: spleeter(1.4.9)
その他のプラットフォーム: Anaconda3(python3.8)
本記事で紹介する内容は、Anaconda3とspleeterがインストール済みであることを前提としています。
未インストールの場合は、以下のページを参考に、事前にインストールしてください。
(Anaconda3)
関連記事

Anacondaは、Pythonインタプリタ(実行環境)と、科学技術計算、データサイエンス、機械学習に関連したパッケージがセットになったプラットフォーム環境です。本記事では、Anaconda環境をWindowPCへインストールする方法と簡単[…]

eye_catch

(spleeter)

関連記事

「Spleeter」とは、「Deezer」という音楽のストリーミング配信を手掛ける企業が提供しているOSSで、コマンド一つで、楽曲を最大4つのパート「ボーカル」「ドラムス」「ベース」「その他」に分類することができます。(詳しい説明は以下のR[…]

eye_catch

概要


この記事では、以下の手順でアーティスト分類器を作成し、その分類器に新しい楽曲データを入力し、正しい推定結果が得られるかを確認します。
[アーティスト分類器作成手順]
  1. トレーニングデータ(楽曲データ)を用意する
  2. 「Spleeter」で①の楽曲データからボーカル音源のみを抽出する
  3. ②で抽出したボーカル音源から特徴量(MFCC)を抽出する
  4. ③で抽出した特徴量にラベル(アーティスト名)を付ける
  5. ④でラベル付けした特徴量をサポートベクターマシン(SVM)で学習させる
[補足説明]

③で記載した特徴量(MFCC)は、「メル周波数ケプストラム係数( Mel Frequency Cepstral Coefficient )」という名称の特徴量で、主に話者認識の分野で使用されています。音声データから音源の特性を表す特徴量である「ケプストラム」を抽出し、高周波数帯の認知機能が低下する(分解能が下がる)という人間の聴覚特性である「メル尺度」を適用したものです。このMFCCは、pythonの「librosa」パッケージを使用すると1行で取得できるため、詳細は割愛しますが、具体的な計算方法について興味のある方は、こちらのページが参考になると思います。

④で記載したサポートベクターマシン(SVM)は、機械学習モデルの一種で「教師あり学習」による分類や回帰問題を扱う際に一般的に使用されています。このモデルを使用した理由としては、一般的に使用されているということもありますが、プログラミング学習サイトのpaizaラーニングの講座「Python×AI・機械学習入門編2」で実際に話者認識の問題を扱う際に使用されていたためです。paizaラーニングの一部の講座は無料で公開されていますので、興味のある方は、ぜひ受講してみてください。

 

1. 実行環境整備


1-1. pythonの「librosa」パッケージをインストールする

「librosa」パッケージをインストールするベース環境は「Spleeter」と同じ仮想環境とすることを推奨します。他の環境を用いる場合は、パッケージの競合やパス設定が異なり正常に動作しない可能性があります。

 

1-2. pythonの「librosa」パッケージがimportできることを確認する

importコマンド実行時にエラーが発生する場合は「librosa」パッケージのインストールに失敗しています。インストール時の標準出力ログを参照し、エラーを解消するようにしてください。

 

2. アーティスト分類器の作成


2-1. 楽曲データを用意する

「Spleeter」は「mp3」「wav」「m4a」といった拡張子を持つ音源データに対応しています。

(筆者が用意した音源データ)

 

楽曲数が極端に少ない場合は、学習精度が下がる恐れがあるため、50曲以上の楽曲を持つアーティストから選別しました。

(音源データのファイルパス)

F:\\music\\{アーティスト名}\\{アルバム名}\\{楽曲名}

「Spleeter」は複数ファイルに対して同時に実行することができません。そのため、pythonスクリプトにより「Spleeter」を連続実行できるようにファイルパスを統一させます。ファイルパスにアーティスト名を含めておくことで、学習データのラベル付けも容易に行えるようにしています。

 

2-2. 「Spleeter」で楽曲データからボーカル音源のみを抽出する

以下のpythonスクリプトにより楽曲データ一つ一つに対して「Spleeter」を実行します。

・入力ファイルのパスは、「F:\\music\\{アーティスト名}\\{アルバム名}\\{楽曲名}.mp3」を想定しています。
・「grep_target_file」関数では、引数「root_dir」で指定したフォルダ配下から、引数「file_pttrn」で指定したパターンに一致するファイルを検索します。
・抽出されたボーカル音源は、「.\\output\\{アーティスト名}\\{アルバム名}\\{楽曲名}\\vocals.wav」に保存されます。

 

2-3. 抽出したボーカル音源から特徴量(MFCC)を抽出する

まず、抽出したボーカル音源のパスを2-2で紹介した「grep_target_file」メソッドで検索します。

次に、ボーカル音源に対して、「librosa」パッケージの「mfcc」メソッドを使用して、特徴量(MFCC)を抽出します。

・学習データのかさましのために、ボーカル音源を5秒間隔に分割して特徴量(MFCC)を抽出しています。
・音圧レベルが50%以下の音源のみで構成されるものは無音区間として、除外しています。閾値を50%以下とした理由としては、音源と波形を直接比較して目算で定めました。
・特徴量(MFCC)はこちらのページを参考に下位12次元のみを扱うようにしています。

 

2-4. 特徴量(MFCC)にラベル(アーティスト名)を付ける

上記2-3で特徴量(MFCC)を抽出する過程で、ファイルパスに含まれる「アーティスト名」「楽曲名」をリスト形式に保持することで、自動的にラベル付けがされるようにしています。

後々の効率化のために、ラベル付けした特徴量(MFCC)データをデータフレーム形式で再格納しておきます。

 

2-5. ラベル付けした特徴量をサポートベクターマシン(SVM)で学習させる

作成した学習モデルを評価するために、学習データをトレーニングデータとテストデータに分割します。

トレーニングデータとテストデータの割合は、8:2としています。

トレーニングデータに使用する楽曲名に対応する特徴量(MFCC)を、データフレームから取得し、SVMで学習させます。

・学習モデルには、「SVC」を使用します。モデルは、「sklearn」パッケージの解説ページに掲載されている以下のチートシートを参考に選定しました。
・特徴量(MFCC)は非線形な「メル尺度」を適用させたものであるため、「Linear SVC」による評価はスキップしました。
・SVCのパラメータは簡単化のためにひとまずデフォルト(未指定)とします。

choosing_the_right_estimator

(出展:https://scikit-learn.org/stable/tutorial/machine_learning_map/)

広告

 

2-6. 作成した分類器をテストデータで評価する

・データフレームには、5秒間隔で抽出した特徴量(MFCC)が格納されているため、1楽曲データに対する推定結果は、分割データごとの推定結果の多数決から決定します。

 

(推定結果)

 

・A列「artist」、B列「title」に対する推定結果が、C列「predicted」に出力しています。また、D列「score」には多数決による正解率を出力しています。
2-7. テストデータの正解率を計算する
・デフォルト設定でのSVCモデルによる正解率は75%です。次章のパラメータ調整により84%まで精度を上げることができます。
2-8. SVCのパラメータを調整する
SVCのカーネルには、非線形な特徴量に対して、良く用いられているRBFカーネルを使用します。他のカーネルを指定することで、精度が良くなる可能性もありますが、学習コストが高いため、カーネルはRBFカーネル固定とします。
RBFカーネルでは主に以下の二つのパラメータを調整します。
  • コストパラメータ(C): この値は誤分類の許容度を表します。値が大きいほど誤分類を許容しないようになる
  • RBFカーネルのパラメータ: γ

 

(コストパラメータ: C)

adjust_c_param

Cの値が大きくなるにつれて、正解率が高くなり、C=100からC=1000で収束することが分かりました(C=10000では学習結果が得られずにタイムアウトしました)。
C=1000では1楽曲内の正解率の最頻値は0.6~0.7、で平均で0.6以上あるため、精度はそこそこ高くでているものと思います。
この結果から、最終的にC=1000を採用することとしました。
(RBFカーネルのパラメータ: γ)
adjust_gamma_param
γの値を適当に変化させることで正解率に変化はなく、目算で設定することは困難と判断しました。
そのため、デフォルト設定と同様のγ=”scale”を採用することとしました。
γの値に”auto”、”scale”を指定した場合の設定値は下記の通りです。 

if gamma='scale' (default) is passed then it uses 1 / (n_features * X.var()) as value of gamma,
if ‘auto’, uses 1 / n_features.
(引用元:sklearn.svm.SVC

広告

3. 新たに用意した音源に対するアーティスト名の推定


3-1. 上記2-1で用意したものとは異なる音源を用意する

昨今はストリーミングサービスを利用しているため、学習に使用したアーティストの追加音源はほとんどありません。そのため、独断と偏見で類似していると思われるアーティストの音源を別途使用します。

本章で推定するアーティスト 学習済み/未学習 学習済みの類似アーティスト
[Alexandros] 学習済み
MY FIRST STORY 未学習 ONE OK ROCK(兄弟関係)
phatmans after school 未学習 BUMP OF CHICKEN
RADWIMPS

 

(筆者が用意した追加の音源データ)

 

3-2. 上記2-2~2-4, 2-6, 2-7と同様の手順で追加のテストデータの正解率を計算する

本章で推定するアーティスト 正解率 考察
[Alexandros] 50% 追加した楽曲は2016年に発売されたアルバム「EXIST!」以降のものがほとんどで、学習させたデータと5年以上開きがあるものが多いことや、2018年に発売された「Sleepless in Brooklyn」はニューヨークで製作されたということで音楽性に変化があったことが正解率が下がった要因ではないかと考えています。
MY FIRST STORY 0%(未学習) 1/19の割合で筆者が類似していると思う「ONE OK ROCK」と推定されました。推定されたアーティストは「BUMP OF CHICKEN」や「ELLEGARDEN」、「BIGMAMA
」など幅広いため、類似するアーティストが学習済みデータの中に存在しなかった可能性があります。類似アーティストには兄弟関係ということで「ONE OK ROCK」を上げましたが、声質や歌唱法は耳で聞き分けられるほどに違いがある印象があります。
phatmans after school 0%(未学習) 17/21の割合で筆者が類似していると思う以下のアーティストであると推定されました。未学習のアーティストであっても声質や歌唱法などから類似アーティストの特定ができるのかもしれません。
「BUMP OF CHICKEN」
「RADWIMPS」

 

課題や所感


学習モデル自体の正解率はパラメータを調整することで84%まで上げることができましたが、SVC以外のモデルや深層学習による方法を試しておらず、比較検討ができないため、この精度が高いのか低いのかは自己満足の域をでません。また、特徴量(MFCC)に関する知見も浅いため、同じアーティストであっても年齢や歌唱法、共鳴部位が変わることで、どのような影響があるかは正直分かりません。そもそも、歌声から人物を推定すること自体が原理上困難な可能性もあります。話声であれば、発声方法はある程度固定であるので話者認識自体はこの特徴量(MFCC)でおおむね推定できそうという感触はありますが。

「Spleeter」で抽出したボーカル音源はアカペラのものと比べて遜色ないと思いますが、コーラスや観客の声援は除外できないため、精度を求めるのであれば、前処理を拡充する必要があると感じました。

今後の取り組みとしては、この記事で紹介した分類器のブラッシュアップや歌詞の自動文字おこしにチャレンジしたいと考えています。時間があれば備忘録を残す予定です。

以上

 

広告