iOSアプリ開発 入門 (7) - CreateMLによる音声分類モデルの学習
「CreateML」による音声分類モデルの学習手順をまとめました。
・iOS14
前回
1. 音声分類
「音声分類」は、音声をあらかじめ定義されているラベルに分類するタスクです。今回は、「会話」「笑い声」「拍手」「沈黙」の4ラベルに分類するモデルを学習します。
2. データセットの準備
◎ AudioSetの取得
「AudioSet」は、YouTubeの動画に手動で注釈が付けられたオーディオイベントの大規模データセットです。
今回は、「AudioSet」から4クラスのオーディオデータを50個ずつ抽出して学習に利用します。
・Speech(会話) : /m/09x0r
・Laughter(笑い声) : /m/01j3sz
・Applause(拍手) : /m/0l15bq
・Silence(沈黙) : /m/028v0c
サイトの「DOWNLOAD」から、以下の2つのCSVをダウンロードしてください。
・eval_segments.csv
「YouTubeID, 開始秒,終了秒,ラベル」のデータが20370行含まれています。
# YTID, start_seconds, end_seconds, positive_labels
--4gqARaEJE, 0.000, 10.000, "/m/068hy,/m/07q6cd_,/m/0bt9lr,/m/0jbk"
--BfvyPmVMo, 20.000, 30.000, "/m/03l9g"
--U7joUcTCo, 0.000, 10.000, "/m/01b_21"
:
・class_labels_indices.csv
ラベルが何を表すかを確認できます。
index,mid,display_name
0,/m/09x0r,"Speech"
1,/m/05zppz,"Male speech, man speaking"
2,/m/02zsn,"Female speech, woman speaking"
:
◎ ラベル毎のCSVの作成
「eval_segments.csv」から、ラベル毎に50個のデータを抽出し、CSVファイルを生成します。
以下のPythonスクリプトをラベル毎に実行します。
・convert.py
import os
# ラベル (コメントを切り替えて実行)
label = ('Speech', '/m/09x0r')
#label = ('Laughter', '/m/01j3sz')
#label = ('Applause', '/m/0l15bq')
#label = ('Silence', '/m/028v0c')
# ファイルの読み込み
result = list()
with open('eval_segments.csv') as f:
for line in f.readlines():
if line.find(label[1]) >= 0:
result.append(line)
# ファイルの書き込み
with open(label[0]+'.csv', mode='w') as f:
f.writelines(result[0:50])
以下の4つのラベル毎のCSVファイルが生成されます。
・Speech.csv
・Laughter.csv
・Applause.csv
・Silence.csv
◎ オーディオデータのダウンロード
「unixpickle/audioset」の「download/download.sh」を参考にダウンロードスクリプトを作ります。
(1) 「download/download.sh」の依存パッケージのインストール。
依存パッケージは以下の4つです。
・bash
・ffmpeg
・youtube-dl
・gzip
自分の環境では、「youtube-dl」が足りなかったので、Homebrewでインストールしました。
$ brew install youtube-dl
(2) 「download/download.sh」の編集。
そのままでは、
・スリープなしに繰り返しデータをダウンロードしにいくので相手方サーバに負荷かける
・wavがgzipで圧縮されてしまうとCreateMLでは使いにくい
といった問題があったので、1ダウンロード毎の5秒スリープを追加し、gzip圧縮を削除しました。
・download.sh
#!/bin/bash
SAMPLE_RATE=22050
# fetch_clip(videoID, startTime, endTime)
fetch_clip() {
echo "Fetching $1 ($2 to $3)..."
outname="$1_$2"
# ファイル存在
if [ -f "${outname}.wav" ]; then
echo "Already have it."
return
fi
# サーバに負荷かけないように5秒スリープ
echo "sleep start"
sleep 5
echo "sleep end"
# wavのダウンロード
youtube-dl https://youtube.com/watch?v=$1 \
--quiet --extract-audio --audio-format wav \
--output "$outname.%(ext)s"
if [ $? -eq 0 ]; then
# wavの部分取得
yes | ffmpeg -loglevel quiet -i "./$outname.wav" -ar $SAMPLE_RATE \
-ss "$2" -to "$3" "./${outname}_out.wav"
mv "./${outname}_out.wav" "./$outname.wav"
else
sleep 1
fi
}
grep -E '^[^#]' | while read line
do
fetch_clip $(echo "$line" | sed -E 's/, / /g')
done
(3) オーディオデータをダウンロード。
「download」フォルダで以下のコマンドを実行します。
$ cat Speech.csv | ./download.sh
$ mkdir Speech
$ mv *.wav Speech
$ cat Laughter.csv | ./download.sh
$ mkdir Laughter
$ mv *.wav Laughter
$ cat Applause.csv | ./download.sh
$ mkdir Applause
$ mv *.wav Applause
$ cat Silence.csv | ./download.sh
$ mkdir Silence
$ mv *.wav Silence
(4) フォルダ構成を以下のように整える。
取得失敗するオーディオデータもあるので、50より若干少なくなりました。
・data
・Speech
- XXXX.wav x 50
・Laughter
- XXXX.wav x 50
・Applause
- XXXX.wav x 50
・Silence
- XXXX.wav x 50
3. プロジェクトの作成
プロジェクトの作成手順は、次のとおりです。
(1) Xcodeのメニュー「Xcode → Open Developer Tool → CreateML」を選択。
(2) 「New Document」ボタンを押す。
(3) 「Sound Classification」を選択し、「Next」ボタンを押す。
(4) プロジェクト名を入力し、「Next」ボタンを押す。
(5) 「Create」ボタンを押す。
4. 音声分類モデルの学習
(1) 「Train Data」に先程準備した「data」フォルダを指定。
(2) 左上の「Train」ボタンを押下。
少し待つと学習完了し、以下のように精度が表示されます。学習データの精度98%、検証データの精度87%なので大丈夫そうです。
5. 音声分類モデルの活用
「Preview」タブでオーディオファイルをドラッグ&ドロップすることで、音声分類モデルを試すことができます。
iOSアプリで使うには、「Output」タブで音声分類モデルを出力します。
次回
この記事が気に入ったらサポートをしてみませんか?