Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
2022.1.27
Ken’ichi Matsui
株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies
音楽波形データからコード
を推定してみる
技術共有会発表資料
社外秘
2
⾃⼰紹介(松井 健⼀)
株式会社Mobility Technologies AI技術開発部
データサイエンスグループ グループマネージャー(Kaggle Master)
(株式会社 ディー・エヌ・エーより出向)
最近のプロジェクト
• ドライブデータの解析 (DRIVE CHART)
• https://drive-chart.com/
著書
• New!「ワンランク上を⽬指す⼈のためのPython実践活⽤ガイド」共著(2022年3⽉予定)
• 「ソフトウェアデザイン 2020年10⽉号 【第1特集】Pythonではじめる統計学 2-4章」著
• 「アクセンチュアのプロフェッショナルが教える データ・アナリティクス実践講座」共著
楽器経験
• ギター、ベース、ドラムを嗜みます。DTMも好きでCUBASE使いです。
経歴
⼤⼿SIer ⇒ ⼤⼿通信キャリア ⇒ 外資系コンサルティングファーム ⇒ 現職
NEW!
3
項目
01|はじめに(音楽の基礎知識)
02|Guitarのコードを識別する
03|サンプラー音源のコードを識別する
04|本物の楽曲のコードを識別する
4
01 はじめに(音楽の基礎知識)
時間
振幅
※ 振幅は無単位らしい (参考:https://oku.edu.mie-u.ac.jp/~okumura/blog/node/2426 )
波形データとは
音と空気の振動の波なのでそれをデータ化したもの。データ化するにあたってサ
ンプリングレート(横軸方向)とビット深度(縦軸方向)という仕様がある。
1. サンリングレートの例:44100 hz(1秒間に44100回データを記録)
2. ビット深度の例: 32bit( 2!"
=4294967296段階の音量) )
データの個数が44100個のところで1秒
振幅方向の
解像度が
2!" 段階
空気
密度
密
疎
6
波形データを動画でわかりやすく
上記の動画を見る: https://matsuken92.github.io/wav_music_analysis/video/enlarge_wave.mp4
7
波形データの読み込み
Librosaというライブラリで簡単にできます。Cornell Birdcall Identificationとい
うKaggleのコンペでお世話になった人もいるのでは。
import librosa
import soundfile as sf
import matplotlib.pyplot as plt
filename = "./soundfile.wav"
sampling_rate = 44100
x , sr = librosa.load(filename, sr=sampling_rate)
plt.figure(figsize=(20, 5))
plt.plot(x)
plt.show()
前ページのグラフを書くコード
⇒ xはnp.ndarrayで得られる
8
ちょっと音楽の話を:コード(和音)とは
本発表では楽器で弾いたコードを識別することをやっていきます。前提知識とし
てコードとは何かを軽く説明します。
コード(和音)とは
三和音の図の出典: https://tomari.org/main/java/audioapi/audio_waon.html
音を複数種類同時に鳴らしたもの。音の組
み合わせに名前がついている。本発表では
主に3種類の音からなる三和音を使う。
参考:周波数の整数比の話
ex: Cはド・ミ・ソのこと
ド ミ ソ
これでCというコード(和音)
ド
ミ ソ
これも構成音が同じなので
Cというコード(和音)
ピアノの場合
ギターの場合
ド
ミ
ソ
ド
ミ このように押さえると
Cというコードの構成音が
鳴る。音が3つじゃなくて
5つだが、uniqueには3種
なので三和音
9
ちょっと音楽の話を:コードの種類(全部理解しなくて良い)
音の組み合わせに全部名前がついているので、実際は非常に多くの組み合わせと
なり種類がたくさんあります。本発表では主要なコードのみを扱います。
1 2 3 4 5 6 7 8 9 10 11 12
イタリア式表記 ド ド# レ レ# ミ ファ ファ# ソ ソ# ラ ラ# シ
英・米式表記 C C# D D# E F F# G G# A A# B
三和音
メジャー
コード
コード名 C C# D D# E F F# G G# A A# B
構成音
8
5
1
9
6
2
10
7
3
11
8
4
12
9
5
1
10
6
2
11
7
3
12
8
4
1
9
5
2
10
6
3
11
7
4
12
三和音
マイナー
コード
コード名 Cm C#m Dm D#m Em Fm F#m Gm G#m Am A#m Bm
構成音
8
4
1
9
5
2
10
6
3
11
7
4
12
8
5
1
9
6
2
10
7
3
11
8
4
12
9
5
1
10
6
2
11
7
3
12
1
• 音の数は12種類(これはこれで全部)
• 和音はタイプはメジャー、マイナーの2種類(これは本当はたくさんあるが本発表では
主要な2種類を扱う)
5 6
3 10 12
8
9 11
7
2 4
よく見ると全体的に1つずれてるだけ
真ん中が1つ
ずれてるだけ
10
ちょっと音楽の話を:コードの種類
メジャーコード:明るい感じ マイナーコード:暗い感じ
コードの種類を音で感じてみる
E E B G# C#m Bm A A G#m G#m C#m C#
B
A
F#m G#m
C C# D D# E F F# G G# A A# B Cm C#m Dm D#m Em Fm F#m Gm G#m Am A#m Bm
うまく組み合わせて繋げると
音楽的になります
(これをコード進行という)
実際の曲での使われ方 (BiSH:オーケストラ)
これだけ覚えて欲しい:音の数が12種類、和音のタイプが2種類、計24種類の主
要なコードをこの発表ではこの後も扱います。
音源の場所: https://matsuken92.github.io/wav_music_analysis/index.html wav1, wav2
wav1
wav2
11
02 Guitarのコードを識別する
12
やりたいこと:
ギターを弾いて作られた波形データをインプットに、それがどのコードかを識別するDeep
Learningモデルを作りたい。
Guitarのコードを識別する:どうやって?
1. ギターを弾く
2. 波形データ化する
3. データセットにする
4. モデルを作って評価する
手順
13
1. ギターを弾く
ギター
オーディオインターフェース
(UA-25)
アナログ信号を
デジタルに変換する
PC
ギターエフェクトソフト
(Amplitube)
DTMソフト(CUBASE)
ギターの音色を
変化させる
録音、書き出し
など
機材とセッティング
14
1. ギターを弾く ①ひたすらギターのコードを弾く
24種コード × ギター2本 x それぞれ数十回
⇒ 計 1351 + 430 = 1751 個の波形データを取得
② 波形データを整える
波形を無音部分でsplitしたり、音量の大小をノー
マライズしたり。
録音
15
1. ギターを弾く
クリーントーン
クランチ
デイストーション
音色を調整する
これにより、弾いた音声データを水増しするこ
とができ、data augmentationのような効果が
得られる。
1751 個の波形データが3倍に!
(validation時のsplitには注意が必要)
音源の場所: https://matsuken92.github.io/wav_music_analysis/index.html wav 3, wav4, wav5
wav3
wav4
wav5
16
2. 波形データ化する
オーディオミックスダウン
で.wavファイルを書き出す。
.wavファイル
※ 長い音声データを書き出してpythonで細切れにする
処理を入れているがここでは説明割愛
17
3. データセットにする
ギター1
ギター2
4053個の
.wavファイル
1291個の
.wavファイル
trainデータ
testデータ
使用したギターを分けて、train-test splitする。
18
3. データセットにする
せっかくなので、Kaggleのコンペに仕立て上げる。
しかし、後述の理由でLaunch
していません
19
4.モデルを作って評価する
https://www.kaggle.com/ttahara/training-birdsong-baseline-resnest50-fast
を少し改造して使います。
モデルのベースラインとしては、 https://twitter.com/tawatawara さんの
.wavファイル
librosa.feature.melspectrogram()
でメルスペクトル化
resnest50_fast_1s1x64d
処理フロー
model.fc = nn.Sequential(
nn.Linear(2048, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024,
24 ))
今回対象としたコードの全種別
24種に呼応。multi class分類とする。
fc層を差し替え
20
4.モデルを作って評価する
結果:ベースラインの時点でめちゃ精度が良い。
問題設定を変更することに
Hostだけができる裏submissionの結果
21
03 サンプラー音源のコードを識別する
22
やりたいこと:
シンセサイザーで作られた波形データをインプットに、それがどのコードかを識別する
Deep Learningモデルを作りたい。
サンプラー音源のコードを識別する:どうやって?
1. さまざまな音色で音声を作り波形データ化する
2. データセットにする
3. モデルを作って評価する
手順
23
サンプラー音源とは
グランドピアノ
エレキピアノ
オルガン
シンセ
アコーディオン
バグパイプ
アコースティックギター
クラビノーバ
ストリングス
ストリングス
ベル
パッド
トランペット
エレキピアノパッド
シンセ
シンセ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
さまざまな楽器やシンセの音色を
扱うことができる。
今回は上記の16種をピックアップ
wav6
wav7
wav8
wav9
wav10
wav11
wav12
wav13
wav14
wav15
wav16
wav17
wav18
wav19
wav20
wav21
音源の場所: https://matsuken92.github.io/wav_music_analysis/index.html wav 6 〜 wav21
24
1.さまざまな音色で音声を作り波形データ化する
グランドピアノ
エレキピアノ
オルガン
シンセ
アコーディオン
バグパイプ
アコースティックギター
クラビノーバ
ストリングス
ストリングス
ベル
パッド
トランペット
エレキピアノパッド
シンセ
シンセ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
16種の音色 9種のボイシング
上記は全て同じCコードで構成音は全
てド・ミ・ソ。異なる高さのドミソを
組み合わせて種類を増やしている
C C# D D# E F
F# G G# A A# B
Cm C#m Dm D#m Em Fm
F#m Gm G#m Am A#m Bm
24種のコード
3456個の
波形データ
サンプル音源で波形データを作る。
25
2. データセットにする
バグパイプ
ストリングス
6
10
グランドピアノ
エレキピアノ
オルガン
シンセ
アコーディオン
アコースティックギター
クラビノーバ
ストリングス
ベル
パッド
トランペット
エレキピアノパッド
シンセ
シンセ
1
2
3
4
5
7
8
9
11
12
13
14
15
16
3024個の
.wavファイル
432個の
.wavファイル
trainデータ
testデータ
音色で分けて、train-test splitする。
26
3.モデルを作って評価する(ギターの時と同じ)
https://www.kaggle.com/ttahara/training-birdsong-baseline-resnest50-fast
を少し改造して使います。
ギターの時同様モデルのベースラインとしては、 https://twitter.com/tawatawara さんの
.wavファイル
librosa.feature.melspectrogram()
でメルスペクトル化
resnest50_fast_1s1x64d
処理フロー
model.fc = nn.Sequential(
nn.Linear(2048, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024,
24 ))
今回対象としたコードの全種別
24種に呼応。multi class分類とする。
fc層を差し替え
27
4.モデルを作って評価する
結果:ベースラインの時点で精度が良い。
楽器単体の主要なコードなら
Deep君は得意なんだな。
Valid:
Test:
Testのconfusion matrix:
28
04 本物の楽曲のコードを識別する
選曲
データを難しくして、実際の楽曲にチャレンジします。選曲は最近お気に入りの
アイナ・ジ・エンドのオーケストラ THE FIRST TAKE version。
https://www.youtube.com/watch?v=URABwFBT8Ok
⇒ 歌とピアノのみなので、シンプルで実際の楽曲の中では取り組みやすそう
アイナ・ジ・エンド - オーケストラ / THE FIRST TAKE
独唱とIntroのピアノは
音が薄くて学習が難しそ
うなので今回は除外
1. データセットにする
楽曲そのまま使うのでmp3を読み込み、trainとvalidのsplitを考える。多数の曲を
扱えると本当は良いのだが、今回は時間の関係で1曲の間で予測ができるかを試す。
中盤のAメロ〜Bメロ〜サビの
2回繰り返し部分をtrainとする。
終盤のサビ〜Outroを
Validにする。
注: mp3はiTunes Storeで購入したものを利用
この曲はin tempoでBPM(テンポ)が85なのでそれをセットすると区切りが良く分
割ができる。
1小節の半分で
分割する
1. データセットにする
Pythonで後で1つ1つのイベントを分割して.wavファイルを作るために、下準備
をしておく。
選択したイベント間にスペーサーを設定
1. データセットにする
すると分割した波形データの間に無音部分
を挟むことができる。そうすると後で
Pythonでここのイベントを切り出すときに
やりやすい。この後.wav書き出しをする。
trainデータ 140files validデータ 76files
1. データセットにする
train-valid splitを行い、216ファイルを得る。これで学習させる。
34
2.モデルを作って評価する(前回までと同じ)
https://www.kaggle.com/ttahara/training-birdsong-baseline-resnest50-fast
を少し改造して使います。
ギターの時同様モデルのベースラインとしては、 https://twitter.com/tawatawara さんの
.wavファイル
librosa.feature.melspectrogram()
でメルスペクトル化
resnest50_fast_1s1x64d
処理フロー
model.fc = nn.Sequential(
nn.Linear(2048, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024, 1024), nn.ReLU(), nn.Dropout(p=0.2),
nn.Linear(1024,
24 ))
今回対象としたコードの全種別
24種に呼応。multi class分類とする。
fc層を差し替え
35
4.モデルを作って評価する
結果:今度は難しすぎたかもしれない…。
Valid:
Validのconfusion matrix:
予測結果が同じところに集まって
しまい、よく予測できているとは言えない
36
もうちょっと何かできないか考える
37
4.モデルを作って評価する リトライ
しかし、前節で作ったシンプルなデータで学習させたモデルをpretrainedモデル
として利用すれば効果があるかも?
Pretrain:
サンプラー音源
resnest50_fast_1s1x64d
resnest50_fast_1s1x64d
preload
本学習:
実際の楽曲
38
結果:十分ではないが可能性を感じる。
Valid:
Validのconfusion matrix(ratio):
4.モデルを作って評価する リトライ
対角線に結果が集まり始めている!
Validのconfusion matrix(個数):
train test
39
まとめと今後の展開
▪ 実際の楽曲のコードをDeep Learningで識別することの可能
性を感じた。
▪ Pretraindモデルの入力データを増やすことと、楽曲データも
豊富に用意して再チャレンジしたい。
▪ 四和音などコードの種類も増やすことも試したい。
40
EOF

More Related Content

音楽波形データからコードを推定してみる