86
66

More than 3 years have passed since last update.

SoundAnalysis + Create MLで話者認識

Last updated at Posted at 2019-06-17
1 / 35

追記1: 本スライドは2019年6月に開催されたイベント向けに作成したものです。


追記2: 「iOS 13の新機能をざっくり把握する本」という電子書籍を

100円

で販売しています。本文84ページ。SoundAnalysisの解説も入っています。


"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



(会場での反応はこんな感じでした)


実装概要 (学習側)

  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] いろいろ本を出してます

  • 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用の波形編集ソフトを使ってチマチマ手作業でやった
86
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
66