Edited at

SoundAnalysis + Create MLで話者認識


"SwiftUI"でGoogle検索

google_swiftui.jpg

(日本語・直近1ヶ月)



"SoundAnalysis"でGoogle検索

Screen Shot 2019-06-17 at 15.24.57.png

(日本語・直近1ヶ月)



イマイチ注目されていない😇



音楽向け?

IMG_E0171.JPG



よくわからないユースケース?

IMG_E0172.JPG



・・・と思われているのでは?



話者認識



話者認識とは


「誰が話しているか?」を認識する

cf. 「何を話しているか」・・・音声認識



話者認識ができると・・・


  • 議事録・翻訳・字幕

  • 動画や音声の無音部分を自動でカット

  • 動画や音声から特定話者の部分だけ抽出

etc.


今は静止画しか使用していないアプリでも、動画のサイズの問題が解決すれば、今後動画を利用する可能性も出てくるのでは?



Sound Analysis



Sound Analysisとは


  • iOS 13で追加された音声解析のためのフレームワーク

  • 今のところ音声の「分類」のみ可能

  • "SoundAnalysis"(リファレンス) か "Sound Analysis"(WWDC)かはっきりしない...



何の音声を分類できるのか?


  • 特定の種類の音声を分類するためのクラス等は何も用意されていない

  • Core MLモデルを自作する必要がある

→ どんな音声でも大丈夫(できるとは言っていない)



音声分類用のCore MLモデルをつくる



Create ML


IMG_E0174.JPG



Sound Analysisで音声分類を実行する



音声分類を実行する

// ファイル用のアナライザを初期化

let audioFileAnalyzer = try! SNAudioFileAnalyzer(url: url)

// MLModelオブジェクトを渡してリクエストを作成
let request = try! SNClassifySoundRequest(mlModel: HogeSoundClassifier().model)

// リクエストをアナライザに追加
try! audioFileAnalyzer.add(request, withObserver: self)

// 解析開始
audioFileAnalyzer.analyze()



分類結果

SNClassificationResult



  • timeRange: CMTimeRange


    • 処理区間の開始時間・終了時間




  • classifications: [SNClassification]


    • 各分類クラスのラベル

    • 各分類クラスの信頼度





(デモ) 動画内の話者を識別する

000004.jpg


(NDAに配慮しデモ動画のスクリーンキャプチャは控えますが、会場での反応はこんな感じでした)



実装概要 (学習側)


  1. トレーニング用音声データを用意

  2. CreateMLで学習 → .mlmodelファイルを出力



実装概要 (アプリ側)


  1. 動画から音声を抽出してファイル化


    • ファイルアナライザで処理するため。ストリーミング音声を解析することも可能




  2. timeRangeに応じて分類結果を表示する



その他



Sound Analysisを使わず、Core MLだけで実装することも可能

IMG_E0177.JPG



Sound Analysisを使うと・・・

IMG_E0178.JPG



overlapFactor


  • 認識に渡されれるバッファの長さは約1.0秒

  • 対象の音声波形が区間の真ん中に来るように、オーバーラップさせながら解析処理を行う

  • オーバーラップするほど取りこぼしが減るが、処理時間はかかる

  • デフォルトは0.5



[PR] いろいろ本を出してます

https://shu223.booth.pm/items


  • iOS 13の機能も追記予定です

  • 電子版は無料でアップデートできます

  • ページ数に応じて値上げするので、今買うと得かも?

Screen Shot 2019-06-17 at 18.15.39.png



補足1

10分のLTなのでいろいろ割愛したことがある


  • デモは confidence と結果の前後関係をみて出力をフィルタしている



    • confidence < 0.7 の結果はカット

    • 前後の認識結果と identifier が違う(つまり孤立している)結果はカット



  • デモでは request.overlapFactor = 0.9



補足2


  • 学習データの録音環境を実行時の環境と合わせる必要がある


    • 学習データ/デモ用シーンともにBGMのないところを選んだ

    • ただ試してみてダメだったわけではない。BGMありも含めて大量のデータを食わせればロバストに認識できるかもしれない





補足3


  • 学習用の音声データはAudacityという昔からあるmacOS用の波形編集ソフトを使ってチマチマ手作業でやった