ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
SoundAnalysisのビルトイン音声識別
Sound AnalysisフレームワークをAppで使用すると、マイクからのライブサウンド、ビデオやオーディオファイルなど、あらゆるオーディオソースからの個別の音を検出・識別し、その音が発生した瞬間を正確に特定できます。ビルトインの音声識別機能を使えば、カスタムのトレーニングモデルがなくても、300種類以上の音を簡単に識別できます。人の声、楽器の音、動物の声、様々なアイテムの音など、いろいろな音を識別できます。 カスタムモデルについては、Audio Feature Print機能抽出ツールを活用して、Appの目的に合わせてサウンドウィンドウの制御を変更できる小さなモデルを作成する方法をご確認ください。 音声識別とSound Analysisフレームワークについては、WWDC19の「Create MLで音声識別モデルをトレーニングする」をご確認ください。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC19
-
ダウンロード
♪ ♪ こんにちは WWDCの音声分析 セッションへようこそ 私ジョン・ホアンは ―オーディオチームの 研究者です 私とケビンが紹介するのは ―Sound Analysisフレームワークと ―Create MLによって 利用可能となった ―音声分類の向上についてです 2019年に Create MLを使用した ―音声分類モデルのトレーニングが 可能になりました 音声分類モデルの作成と Appleデバイスへの配信が ―容易にできることを 紹介しました このフレームワークを使えば ―ハードウェアアクセラレーション用に ―全ての処理が最適化され ―デバイス上でローカルに 実行されます 音声をクラウドに 送らないので ―ユーザーのプライバシーは 保護されます 今回私たちはSound Analysis フレームワークを活用し ―サウンド認識というアクセサビリティ 機能をOSに導入しました この機能は アラームや 動物 家庭の音など ―周囲から特定の音が ―検出されたときに ―ユーザーに通知します これは音声分類の活用法の 一端に過ぎません 他に何ができるか みてみましょう このデモAppは Macの内蔵マイクを使って ―環境音を聞いています 音声は音声分類器を経由して ―UIに分類結果が ―表示されます 今 私の話し声も 検出されています さて何が起きるのか 少しくつろいで ―待ちましょうか 音楽をかけますね クルンとマンブルの 「Catch a Vibe」をかけて クルンとマンブルの 「Catch a Vibe」を流します ♪ ♪ ♪ ああ、ああ、ああ♪ 分類器が楽器と歌声の ―両方を検出しています [] ♪あなたほどしっくりくる♪ ♪人なんていない ♪ ♪ ピンときたの 私たち ♪ ♪ 最高に気が合うって ♪ お茶にしましょう ♪ 大丈夫よ ベイビー ♪ ♪ 私たちは一緒がいいって ♪ ♪ 確かめあったでしょう ♪ ♪ あなたの笑顔には何かが 宿っているの ♪ ♪息を潜めて ねえ♪ ♪ お互いを 感じ合いましょう ♪ ♪ 私たちだけのバイブスを ♪ ♪ 大丈夫よ ベイビー 私たち ♪ ♪ 一緒がいいって ♪ ♪ 言ったでしょ ♪ ♪あなたの目に映るアートは ♪ ♪ 私の一部なの ♪ ♪ 私を誇りに思って ♪ 美味しい ♪ あなたは私の全てなの ♪ ♪ 理解だってしてるわ ♪ ♪ どうしてこうなってしまったの ♪ ♪ どうして ♪ Hey Siri 止めて 音のカテゴリーごとに ―音声データを集めて Create MLを使用して ―カスタムモデルを トレーニングしたはずですね ええ 今まではそうしてきました でも実は 分類器はOSに ビルトインされていたんです 今年新たに 音声分類器を ―Sound Analysisフレームワークに 搭載しました あなたのAppで 音を分類することが ―さらに容易になったのです 全てのプラットフォームを サポートします
内蔵の分類器は全て 開発者の体験を ―簡素化するためものです 大量のデータ収集や分類の ―手間もかかりませんし ―機械学習や音声に関する 専門知識も ―高精度のモデルを ―開発するための 大きな処理能力もいりません これらを心配しなくて 済むので ―Appのユーザーエクスペリエンスを ―向上させることに 集中できます たった数行のコードで ―音声分類が可能になります 分類器に何ができるか お見せします ここに300以上の カテゴリーがあります 詳しく見ていくと ―動物の音 ペット 家畜 ―野生動物に分類できます
音楽の場合 多くの楽器が識別できます 鍵盤楽器 打楽器 ―弦楽器 管楽器も区別します 人が出す様々な音も 判別可能です 群衆が出す音や ―呼吸音 発声音などあります
さらに乗り物や アラーム ―道具 水の音なども ―区別します これらのカテゴリーはすぐに 利用可能です ぜひお試しを 音声分類器の使い方の説明は ―ケビンに任せます ありがとう ジョン 私ケビンは ―オーディオチームの ソフトウェアエンジニアです 新搭載の音声分類器の ―使い方を 私が開発した ―アプリケーションを 参照しながらお見せします 分類器が機能する様子を ―ジョンがカウベルを使って 紹介しようとしたのですが ―デモで失敗して以来 ―別のアイディアを閃きました 私のMacには このセッションの準備中に ―集めたメディアが 複数入っています その中にカウベルの音を含む ―映像が間違いなくあります ぜひお見せしたいのですが ―まずは見つけないと いけません ―つまりファイルを 探しだす必要があります そしてカウベルの場面を ―見つけるために 中を見ないといけないはず さあ どうやるでしょう 内蔵の音声分類器を使って ―ファイルを読み取り ―特定の音が 入っているかどうかを ―教えてくれる 簡単なプログラムを書きます 音が見つかれば ―プログラムが分類器を使用し ―音がいつ発生したか 教えてくれます
そしてmacOSで利用できる ―ショートカットを使って ―多くのファイルを対象に ―私のプログラムを実行する ワークフローが作成できます プログラムが音を発見すると ―ワークフローは自動的に ―検出結果の発音時間を使って ―その音を含む動画クリップを 抜粋できます カウベルの場面を 見つけるのに最適でしょう
やってみましょう
動画がたくさん入った フォルダを用意しました
全てのファイルを選択して ―クイックアクションメニュー でショートカットを実行
選択肢から見つけたい音を 選びます 今回はカウベルですね
すると ショートカットが実行され ―わずかな時間で ―探していた音を発見し ―Finderウィンドウに 表示されます 開いてみましょう カッコいいよ ジョン 使用したショートカットを 詳しく見てみましょう
ショートカットを起動すると ―認識できる全ての音の ―リストを収集して ―1つ選ぶように指示します 選択した音を使って Finderで選択した ―全てのファイルにアクセスし ―その中から音を探します 目当ての音を発見すると ―音が発生する数秒間を ―動画から抜粋して ―出来上がったクリップが 表示されます このうち2つのステップで ―内蔵の分類器が活躍します ショートカットから 必要に応じて利用するため ―この2つのステップを ―カスタムアプリケーションに 実装しました
ショートカットについて 詳しくは述べませんが ―詳細を知りたい方は ―WWDCセッションの ―”macOSのショートカット” を参照してください
では App内の2つの ―カスタムアクションの 実装を紹介します 最初のアクションでは Appが認識できる ―全ての音の種類を取得します 内蔵の分類器を使用すると ―数百種類の音が認識できます これは音のリストを取得するために 書いた関数です 新しいイニシャライザで ―SNClassifySoundRequestを 作成し ―内蔵の分類器を 選択可能にします このリクエストを使って ―分類器が保持している音リストに ―クエリできます 2つ目のアクションでは ファイル内で音が ―いつ発生したかを ショートカットに伝えます これを実現するために 音声分類を実装し ―音が検出された場合 ―最初に検出された時間を 報告します 音声分類を実行するために ―必要なものが3つあります 1つ目は SNClassifySoundRequestで 音声分類器を設定するために 使用します 2つ目は SNAudioFileAnalyzerです 対象とするファイルを指定し ―分類できるようになります 3つ目は ―少し注意が必要です 分類結果を処理する 専用のオブザーバータイプを ―定義する必要があります オブザーバーについては いったん置いておいて これは最初の2つの 準備用コードです
SNClassifySoundRequestで ―内蔵のモデルを使った 分類器を作成します SNAudioFileAnalyzerは ―分類したいファイルの URLを指定して作成します この時点でオブザーバーが 準備できていたら ―音声分類は簡単に始められますが ―オブザーバーが欠けている ―前提で進めましょう ここにNSObjectから継承し ―SNResultsObserving プロトコルに準拠した ―未完成の オブザーバーがあります 探したい音声ラベルで ―インスタンスを初期化し ―音を検出した時間を 格納するために ―CMTimeメンバ変数を加えます ―あとは request: didProduce result メソッドを ―実装するだけです このメソッドは 音声分類の リザルトが生成された時に ―呼び出されるため ―SNClassificationResultの ―インスタンスを受け取ります また result の classificationForIdentifier メソッドを使って ―探しているラベルに関する ―情報を抽出することができます ラベルの信頼度スコア conference が ―しきい値を超えると ―その音が検出されたと みなします 初めて検出したときに ―音が発生した時間を 保存しておけば ―後でショートカットに 提供できます
これで私のオブザーバーは 完成です ファイル内で音の発生を ―判定するための材料は 全て揃いました この例ではさらに議論したい ―2つの重要なトピックに 触れています まずは検出時間について ―それから検出しきい値ついて お話します
検出時間について 始めましょう 音声を分類したとき ―音声信号は 重なり合う ウィンドウに分割されます それぞれのウィンドウ毎に ―検出された音の種類と ―信頼度を持った ―リザルトが得られます ―また 音声のどの部分が ―分類されたかを示す ―時間の範囲も得られます 私のアプリでは 音を検出すると ―音の発生時間を判別するために ―リザルトの時間の範囲を利用します しかし ウィンドウの長さが変わると ―時間範囲に影響することも あります ウィンドウの長さを ―大小変化させることで ―目的に応じて カスタマイズしましょう
短いウィンドウは ドラム音のような短い音に ―有効です その音の重要な特徴を ―短時間で全て捉えることが ―できるからです 短かくても 重要な特徴が ―抜けることはありません 短いウィンドウ期間は ―音の発生時間をより正確に ―捉えられるメリットがあります
しかし 短いウィンドウ期間は ―長い音には適しません 例えば サイレンは ―音の立ち上がりと立ち下がりの両方を ―長い時間をかけて表現します これらの音程を 1つのウィンドウに ―まとめて取り込むことで ―分類器が正確に 音を検出できます 関心のある音の重要な要素を 全て捉えるのに ―十分な長さの ウィンドウ期間を ―使用しましょう ウィンドウ期間を 変更したい場合 ― SNClassifySoundRequest の ― windowDuration プロパティを 設定します ただし 全ての ―ウィンド期間に対応する わけではありません
―分類器によって使用できる ウィンドウ期間が ―異なることがあります SNClassifySoundRequest の ― windowDurationConstraint プロパティを参照すると ―サポートするウィンドウ期間が 確認できます 内蔵の分類器は 1/2秒から15秒までの ―ウィンドウ期間を使用できます Appに分類器を導入する際 ―1秒以上の期間を設定すると ―良いスタートが 切れるでしょう
次は信頼度の しきい値についてお話しします 私のAppでは音声分類の信頼度が ―一定のしきい値を超えると ―その音が検出されると考えます ―私はしきい値に0.5という 数値を選びました しかし しきい値を選択する際に ―考慮すべきことがあります 分類器は同時に複数の音を ―検出することができます ―このとき 信頼度の高い分類が ―複数あることに気づくでしょう
Create MLで訓練した カスタムモデルを ―使用した場合と異なり 分類スコアの合計は足しても ―1にはなりません 信頼度は独立したものであり ―互いに比較すべきでは ありません
信頼度のスコアは 独立しているので ―音によって異なる 信頼度のしきい値を ―選択すると良いでしょう ―しきい値の選択は トレードオフが発生します 信頼度のしきい値が高い場合 ―音が誤検出される確率は 低くなりますが ―一方で 検出されても ―強さが十分でないものだと ―見逃す可能性が高くなります しきい値を設定するときは ―使用事例に応じて ―バランスが取れた値を 見つける必要があります なお カスタムウィンドウ 期間を設定すると ―信頼度のスコアが変化する 場合があり ―しきい値にも影響します 内蔵の分類器を 使用するときの ―最後の注意点は ―似ている音が存在するという点です 分類器が識別できる たくさんの音の中には ―音だけでは ―人間ですら区別の難しい ―音のグループがあります 可能な限り 聞き取る音の種類を ―絞るのがベストです Appを使用する場所で ―発生しそうな音だけに ―注目するようにします ここで 音声分類に関する ―Create MLの 新機能について ―ジョンに話してもらいます ケビン 素晴らしい例をありがとう カウベルのビデオは いかがでしたか では Create MLの新機能 ―具体的には ―内蔵の分類器の力を使って ―カスタムモデルを 改善する方法を紹介します 内蔵の分類器は 多岐に渡るカテゴリーの ―膨大なデータによって トレーニングされています つまり モデルは既に 音声分類について ―多くの知識を含んでいます これらの知識は Create MLを使った ―カスタムモデルの学習に 活用できます ―その様子をお見せします 音声分類器は2つの異なる ―ネットワークに分かれます 1つ目は特徴抽出器で 2つ目は分類器モデルです 特徴抽出器は ―埋め込みモデルと 呼ばれることもあり ―ネットワークの要です 特徴抽出器は オーディオの波形を ―低次元の空間に変換できます 良くトレーニングされた特徴抽出器は ―音響的に類似した音を ―空間内の近い場所に まとめます
例えば ―ギターの色々な音はまとまりますが ―ドラムや車の音は 遠い場所に配置されます
パイプラインの2つ目は ―分類器モデルです 分類器モデルは 特徴抽出器の出力を受けて ―クラス確率を計算します この分類器は ―内蔵の音声分類器に 含まれるような ―優れた特徴抽出器と ペアになるとより効果的です
今回 内蔵の分類器に含まれる 特徴抽出器を ―Appからも 利用できるようにしました これは Audio Feature Print と呼ばれ ―カスタムモデルを Create MLで学習させると ―そのモデルが Audio Feature Print とペアになります これであなたのモデルは ―内蔵の分類器が持つ全ての 知識を利用できます 旧世代の特徴抽出器と 比較すると ―Audio Feature Print は 全面的に改善されています ネットワークがより小型化 高速化したにも関わらず ―比較した全ての ―ベンチマークデータセットで 高い精度を達成しています 内蔵の分類器のように ―Audio Feature Print を 使用したモデルは ―ウィンドウ期間に 柔軟に対応します サイレン音などに最適な ―長いウィンドウ期間も ―ドラム音などに適した 短い期間も選択できます Audio Feature Print は Create MLを使って ―カスタムモデルをトレーニングする デフォルトの特徴抽出器です
学習時ウィンドウ期間は ―1つの特徴を生成するために 使用する音声の長さです 初期設定では3秒ですが ―ニーズに合わせて 調整可能です Create MLでは ―1/2秒から15秒の間で 長さを選択できます カスタムモデルの トレーニングに関する詳細は ―2019年のセッションから ―”Create MLを使った 音声分類モデルの ―トレーニング法”を ご覧ください カスタムモデルで推論を実行するための Audio Analysis フレームワークの ―使用法も紹介しています 音声分析のセッションへの ―ご参加に感謝します OSに内蔵した強力な 新しい音声分類器を ―紹介しました それに伴い ―Create MLの特徴抽出器も アップグレードしました これらが新しい可能性を 引き出し ―あなたのAppでどのように 活用されるのか楽しみです 引き続きWWDCを お楽しみください [音楽]
-
-
8:12 - Get list of recognized sounds
func getListOfRecognizedSounds() throws -> [String] { let request = try SNClassifySoundRequest(classifierIdentifier: .version1) return request.knownClassifications }
-
9:19 - Create sound classification request
let request = try SNClassifySoundRequest(classifierIdentifier: .version1) let analyzer = try SNAudioFileAnalyzer(url: url) var observer: SNResultsObserving // TODO try analyzer.add(request, withObserver: observer) analyzer.analyze()
-
9:52 - Implement sound classification observer
class FirstDetectionObserver: NSObject, SNResultsObserving { var firstDetectionTime = CMTime.invalid var label: String init(label: String) { self.label = label } func request(_ request: SNRequest, didProduce result: SNResult) { if let result = result as? SNClassificationResult, let classification = result.classification(forIdentifier: label), classification.confidence > 0.5, firstDetectionTime == CMTime.invalid { firstDetectionTime = result.timeRange.start } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。