見出し画像

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」ボタンを押す。

画像3

(4) プロジェクト名を入力し、「Next」ボタンを押す。
(5) 「Create」ボタンを押す。

4. 音声分類モデルの学習

(1) 「Train Data」に先程準備した「data」フォルダを指定。

画像3

(2) 左上の「Train」ボタンを押下。
少し待つと学習完了し、以下のように精度が表示されます。学習データの精度98%、検証データの精度87%なので大丈夫そうです。

画像4

5. 音声分類モデルの活用

「Preview」タブでオーディオファイルをドラッグ&ドロップすることで、音声分類モデルを試すことができます。

画像5

iOSアプリで使うには、「Output」タブで音声分類モデルを出力します。

次回


この記事が気に入ったらサポートをしてみませんか?