🔊

Sound Analysisのビルトイン音声分類器

2021/12/01に公開

Sound Analysis(SoundAnalysisと表記されることも)は、音声解析のためのフレームワークです。ディープラーニングで音声を分類/識別することができます。

音声分類のことをSound Classification、音声分類に用いるモデル(音声分類器)をSound Classifierと呼びます。

iOS 15でこのSound Analysis / Sound Classificationが大幅にアップデートされました。その中から、本記事では「ビルトイン分類器」 (Built-in Sound Classifier) について紹介します。

ビルトイン音声分類器とは

これまでは自分でトレーニングデータセットを用意してCreate MLでモデルの学習から行う必要がありました。[1]

画像に対してはCore MLより上位レイヤーにVisionフレームワークが用意されており、人間の顔や動物等、多種多様なものをモデルの自作不要で検出・分類できたのに対し、音声に対してはiOS 13でも14でも、相変わらずすべてを自前で用意する必要がありました。

しかしiOS 15では、ついにシステム組み込み(ビルトイン)の音声分類器が利用できるようになりました🎉

自前でデータセットを用意してモデルの学習から行わなくても、iOS/macOSに標準搭載されている機能として汎用的な音声分類器を利用できるようになったわけです。

約300種類の音声を判別可能

このビルトインモデルでは、犬や猫等の動物の鳴き声、ギターやドラム等の楽器、拍手や笑い声等の人間による音声等、もろもろ300種類の音声を判別できます。

識別可能なラベルの全リストについては後述します。

watchOSやtvOSでも利用可能

ちなみにこのビルトインモデル、watchOSやtvOSにも入っています。

腕時計上でスタンドアロンでこの300種類以上の音声を判別できるのは何かおもしろいことができそう

Multi-label classifier

実際にアプリケーションで音声分類を利用する際に、精度に大きく寄与するのがこちら。

従来の音声分類だと、「この区間はギター」「この区間はドラム」みたいに、基本的に各区間(ウィンドウ)ごとに1位のクラスを決めるようになっていました。(全クラスについてConfidenceは出るのだが、合計値が1になるように出力されるため、ギター0.3、ドラム0.3、...みたいになるとそれは信頼度が低いということになってしまう)

現実的な状況では複数の音が重なっているケースの方が多いので、これは実用面ではわりと大きな制約でした。

しかしbuilt-in sound classifierでは「マルチラベル」に対応しており、

複数の音が同時に鳴っている区間については複数のラベル(クラス)のConfidenceが高く算出されるようになっています。

このマルチラベルはビルトインモデルだけで、Create MLのカスタムモデルではまだサポートされていないようです。

The classifier can detect multiple sounds at the same time. When this happens, you may notice that several labels score with high confidence.
(分類器は複数の音を同時に検出することがあります。このような場合、いくつかのラベルが高い信頼度でスコアされていることに気づくかもしれません。)

Unlike when using a custom model trained using CreateML, label scores do not add up to a value of one. The confidences are independent and shouldn't be compared against one another.
(CreateMLで学習したカスタムモデルを使用する場合とは異なり、ラベルのスコアは加算されて1の値にはなりません。信頼度は独立しており、互いに比較するべきではありません。)

("Discover built-in sound classification in SoundAnalysis" より引用)

結局どう嬉しいのか?

ビルトイン音声分類器のメリットをまとめます。

  • モデル(分類器)を自前で用意しなくても音声分類を利用可能
    • 学習用データを自前で用意し、学習させる、というのは非常にコストのかかる作業だった
  • Apple謹製で、自分のようなMLの素人がデータを集めて学習させたモデルよりも精度が高い
  • モデルをアプリに同梱しなくても良いのでアプリのダウンロードサイズが小さくなる
  • 約300種もの音声を判別可能
    • 汎用的に使えそうなものも多い
  • マルチラベルのサポート

識別可能なラベル(クラス)の全リスト

WWDC21のセッションでは上述の画像のように一覧表示されていましたが、実際にフレームワークから出力してみました。

コードとしてはこれだけ:

let request = try! SNClassifySoundRequest(classifierIdentifier: .version1)
let classifications = request.knownClassifications

SNClassifySoundRequest のiOS 15で追加された新しいイニシャライザ SNClassifySoundRequest(classifierIdentifier:) の引数の型はSNClassifierIdentifier。いまのところ .version1 だけが指定できます。

SNClassifySoundRequestknownClassifications も新たに追加されたメソッドで、String 型で識別できる音声クラスのラベル名の一覧が取得できます。

var knownClassifications: [String] { get }

version1 では、識別できる音声は全部で303種類。以下その全リスト。

speech
shout
yell
battle_cry
children_shouting
screaming
whispering
laughter
baby_laughter
giggling
snicker
belly_laugh
chuckle_chortle
crying_sobbing
baby_crying
sigh
singing
choir_singing
yodeling
rapping
humming
whistling
breathing
snoring
gasp
cough
sneeze
nose_blowing
person_running
person_shuffling
person_walking
chewing
biting
gargling
burp
hiccup
slurp
finger_snapping
clapping
cheering
applause
booing
chatter
crowd
babble
dog
dog_bark
dog_howl
dog_bow_wow
dog_growl
dog_whimper
cat
cat_purr
cat_meow
horse_clip_clop
horse_neigh
cow_moo
pig_oink
sheep_bleat
fowl
chicken
chicken_cluck
rooster_crow
turkey_gobble
duck_quack
goose_honk
lion_roar
bird
bird_vocalization
bird_chirp_tweet
bird_squawk
pigeon_dove_coo
crow_caw
owl_hoot
bird_flapping
insect
cricket_chirp
mosquito_buzz
fly_buzz
bee_buzz
frog
frog_croak
snake_hiss
snake_rattle
whale_vocalization
coyote_howl
elk_bugle
music
plucked_string_instrument
guitar
electric_guitar
bass_guitar
acoustic_guitar
steel_guitar_slide_guitar
guitar_tapping
guitar_strum
banjo
sitar
mandolin
zither
ukulele
keyboard_musical
piano
electric_piano
organ
electronic_organ
hammond_organ
synthesizer
harpsichord
percussion
drum_kit
drum
snare_drum
bass_drum
timpani
tabla
cymbal
hi_hat
tambourine
rattle_instrument
gong
mallet_percussion
marimba_xylophone
glockenspiel
vibraphone
steelpan
orchestra
brass_instrument
french_horn
trumpet
trombone
bowed_string_instrument
violin_fiddle
cello
double_bass
wind_instrument
flute
saxophone
clarinet
oboe
bassoon
harp
bell
church_bell
bicycle_bell
cowbell
tuning_fork
chime
wind_chime
harmonica
accordion
bagpipes
didgeridoo
shofar
theremin
singing_bowl
disc_scratching
wind
wind_rustling_leaves
wind_noise_microphone
thunderstorm
thunder
water
rain
raindrop
stream_burbling
waterfall
ocean
sea_waves
gurgling
fire
fire_crackle
boat_water_vehicle
sailing
rowboat_canoe_kayak
motorboat_speedboat
car_horn
power_windows
vehicle_skidding
car_passing_by
race_car
truck
air_horn
reverse_beeps
bus
emergency_vehicle
police_siren
ambulance_siren
fire_engine_siren
motorcycle
traffic_noise
rail_transport
train
train_whistle
train_horn
railroad_car
train_wheels_squealing
subway_metro
aircraft
helicopter
airplane
bicycle
skateboard
engine
lawn_mower
chainsaw
engine_knocking
engine_starting
engine_idling
engine_accelerating_revving
door
door_bell
door_sliding
door_slam
knock
tap
squeak
drawer_open_close
dishes_pots_pans
cutlery_silverware
chopping_food
frying_food
microwave_oven
blender
water_tap_faucet
sink_filling_washing
bathtub_filling_washing
hair_dryer
toilet_flush
toothbrush
vacuum_cleaner
zipper
keys_jangling
coin_dropping
scissors
electric_shaver
typing
typewriter
typing_computer_keyboard
writing
telephone
telephone_bell_ringing
ringtone
alarm_clock
siren
civil_defense_siren
smoke_detector
foghorn
ratchet_and_pawl
clock
tick
tick_tock
sewing_machine
mechanical_fan
air_conditioner
printer
camera
hammer
saw
power_tool
drill
hedge_trimmer
gunshot_gunfire
artillery_fire
fireworks
firecracker
eruption
boom
chopping_wood
wood_cracking
glass_clink
glass_breaking
liquid_splashing
liquid_sloshing
liquid_squishing
liquid_dripping
liquid_pouring
liquid_trickle_dribble
liquid_filling_container
liquid_spraying
water_pump
boiling
underwater_bubbling
whoosh_swoosh_swish
thump_thud
basketball_bounce
slap_smack
crushing
crumpling_crinkling
tearing
beep
click
bowling_impact
playing_badminton
playing_hockey
playing_squash
playing_table_tennis
playing_tennis
playing_volleyball
rope_skipping
scuba_diving
skiing
silence

iOS 14で追加された「サウンド認識」との関係

上記リストには見覚えがある項目もあると思いますが、iOS 14からある「サウンド認識」にある項目も一通り含まれているようです。

項目が完全に一致していることから、まず間違いなく、このサウンド認識機能ではこのビルトイン分類器を使用しているはずです。

つまり、おそらくこのビルトイン分類器はiOS 14から内部的には存在していて、iOS 15でついに我々サードパーティアプリ開発者に開放された、ということなのでしょう。

実装方法

基本的な実装方法は以前とほとんど変わっていません。

let audioFileAnalyzer = try! SNAudioFileAnalyzer(url: url)

// ここだけが新しい
let request = try! SNClassifySoundRequest(classifierIdentifier: .version1)

try audioFileAnalyzer.add(request, withObserver: self)
audioFileAnalyzer.analyze()

ラベル一覧を出力する際にも使用した SNClassifySoundRequest の新しいイニシャライザ SNClassifySoundRequest(classifierIdentifier:) を使用する点だけが実装として新しいところです。[2]

用途・精度は?

WWDC21のSound Analysisのセッションではカウベル(cowbell)を認識するデモをやっていて、

「もっと有用性がアピールできるクラスを使用すればいいのに...」と思ってしまったのですが、上述の一覧を見ると汎用性のあるクラスも多々見受けられます。

私はこの中に speech といったクラスがあることに着目し、このビルトイン音声分類器を「AIで人の声を抽出して動画から自動で無音をカットする」Chopperというアプリに組み込みました。

https://apps.apple.com/jp/app/id1560947520

もともとCreate MLのSound Classificationテンプレートで学習させたカスタムモデルを使用していたのですが、精度を比較したところ圧倒的に新しいビルトインモデルの方が良かったため、ごそっとこちらのビルトインモデルで置き換えました。 [3]

本当に精度が良く、YouTubeでよく行われている「ジェットカット」のような編集が完全自動で一瞬でできます。動画だけでなく音声ファイルにも対応しているので、YouTubeやPodcastをやっている方はぜひ試してみてください。

https://twitter.com/shu223/status/1440276985075290120

その他のアップデート

Audio Feature Print

ビルトインの音声分類器が搭載されたことに伴い、Create MLでカスタムモデルを作成する際に、ビルトインモデルのFeature Extractor(特徴抽出器)を利用した転移学習もサポートされました。

このFeature ExtractorはAudio Feature Printと呼ばれ、Create MLでSound Classifierを学習させる際に次のように選択することができます。[4]

これの何が嬉しいかというと、

  • 学習データが少なくても高精度のモデルが作成できる
  • 学習時間が短縮される
  • モデルサイズが大幅に小さくなる

といった大きなメリットが多々あります。

windowDuration

iOS 15/macOS 12から SNClassifySoundRequestwindowDuration プロパティが追加され、Window Durationが可変になりました。

これも地味ながらめちゃくちゃ重要なアップデート。

https://twitter.com/shu223/status/1402081278246088709

ただしどんなdurationでも自由に指定できるわけではなく、各classifierごとに設定された windowDurationConstraint の範囲で指定できます。

既存の分類器(Audio Feature Printを用いずにCreate MLで学習させたカスタムモデル)では 975 ms 固定なのですが、
ビルトインの分類器では windowDurationConstraint0.5秒〜15秒の範囲で指定可能です。

The built-in classifier supports window durations between 1/2 second long and 15 seconds long.


この記事は iOS Advent Calendar 2021 9日目の記事です。

脚注
  1. Sound Analysisの基礎やモデルの学習方法についてはこちらの記事をご参照ください: SoundAnalysis + Create MLで話者認識 ↩︎

  2. Sound Analysisの基本的な実装方法はこちらの書籍でも解説しています。 ↩︎

  3. もともと使用していたカスタムモデルと新しいビルトインモデルの精度の比較についてはこちらの動画で詳しく解説しています: https://www.youtube.com/watch?v=FhjaQxJ9Pxo ↩︎

  4. Image Classification(画像分類)にもカスタムモデルで共通に使えるFeature Extractorがあり、そちらはVision Feature Print と呼ばれています。詳しくは 拙著 の「パイプラインモデルとリンクモデル(Linked Model)」の章をご参照ください。 ↩︎

Discussion