Vigilant Ear

Пользовательские звуковые пакеты — как создать и импортировать свои собственные

Vigilant Ear может изучать новые звуки. Пользовательский звуковой пакет учит приложение распознавать звуки, которые не знает встроенный детектор Apple — местные птицы, конкретная работающая машина, странный зуммер в коридоре вашего здания. Вы обучаете небольшую модель на Mac (программировать не нужно), упаковываете её в zip с двумя небольшими текстовыми файлами и импортируете на iPhone.

Пользовательские пакеты накладываются поверх встроенного детектора. Включение пакета никогда не выключает ничего другого — сирены, сигнализации и все остальные звуки безопасности продолжают работать точно так же, как и раньше.

Вам понадобится: Mac с приложением Xcode Create ML (бесплатно), аудиозаписи ваших звуков и Power Pack+ на вашем iPhone (бесплатная пробная версия засчитывается).


Жесткие требования — сделайте их правильно

Пакет, который игнорирует любой из них, будет импортирован, но будет вести себя плохо (постоянные ложные оповещения или ничего не обнаружено). Это не предложения:

  1. Включите класс Background — обязательно, а не по желанию. Ваша модель должна иметь класс, рассчитанный на реальные условия окружающей среды (тихая комната, улица, работающий вентилятор). Заполните его 15+ реальными записями и отметьте "category": "ignored" и "threshold": 1.1 в profiles.json. Без класса Background ваш рюкзак будет постоянно срабатывать в тишине — классификатор звука вынужден выбирать один из своих классов для каждого момента звука, поэтому без сегмента «Ничего из этого» он помечает вашу тихую комнату как то, на что она больше всего похожа.
  2. Удалите тишину из обучающих видеороликов. Клип с надписью «Сова», представляющий собой 20 секунд тишины с одним уханьем, учит модель тому, что молчание — это сова. Обрезайте клипы точно по целевому звуку, иначе модель запомнит пробелы.
  3. Назовите файл модели точно model.mlmodel или model.mlpackage. Любое другое имя → импорт невозможен.
  4. Используйте модель Create ML Sound Classification. Модели изображений, текста и таблиц отклоняются.
  5. Ключи profiles.json должны точно соответствовать меткам классов модели, т. е. именам папок обучения, включая регистр и символы подчеркивания.
  6. Добавьте gateClasses (см. ниже). Без этого музыка и телевидение вызовут стаю. Это самый крупный контроль ложной тревоги.
  7. Заархивируйте файлы на верхнем уровне (или внутри одной папки — не глубже). pack.json должен быть доступен для поиска.
  8. Сбалансируйте занятия. Не давайте одному классу 100 клипов, а другому 10 — модель будет склоняться к большему. Ограничьте классы с большой выборкой, чтобы значения находились в пределах ~3× друг от друга.

В оставшейся части руководства каждый из них рассматривается по порядку.


Шаг 1. Соберите обучающее аудио

Создайте папку для каждого звука, который вы хотите распознать, назовите его в честь этого звука и заполните ее примерами записей:

TrainingData/
  Mourning_Dove/        ← 20+ clips of mourning doves
  House_Finch/          ← 20+ clips of house finches
  Background/           ← 20+ clips of your ambient environment WITHOUT the sounds

Советы, которые действительно изменят ситуацию:

Шаг 2 — Обучение модели в Create ML

  1. Откройте Create ML (на Mac с Xcode: меню Xcode → Открыть инструмент разработчика → Create ML) и создайте новый проект Sound Classification.
  2. Перетащите папку TrainingData в Обучающие данные.
  3. Нажмите Обучить. Несколько сотен клипов обучаются за считанные минуты.
  4. Проверьте вкладку «Точность» — если один класс получает плохие оценки, ему нужны более или более разнообразные клипы.
  5. На вкладке Вывод нажмите Получить и сохраните модель как model.mlmodel (или model.mlpackage — оба работают). Имя файла должно быть именно model.mlmodel или model.mlpackage.

Шаг 3 — Напишите pack.json

Крошечный манифест, описывающий пакет:

{
  "id": "com.example.pack.socalbirds",
  "name": "SoCal Birder's Companion",
  "version": "1.0",
  "author": "Your Name",
  "classes": ["Mourning_Dove", "House_Finch", "Background"],
  "gateClasses": ["bird", "bird_vocalization", "bird_chirp_tweet", "pigeon_dove_coo", "crow_caw"]
}

gateClasses — пусть модель Apple станет вашим вышибалой

Ваша модель - специалист: она хорошо определяет какой из ваших звуков она слышит, но понятия не имеет, что такое «ни один из моих звуков» (в этом и помогает класс Background). Встроенный классификатор Apple — это универсальный классификатор, обученный примерно на 300 повседневных звуках. Он очень хорошо справляется с грубым вопросом «есть ли вообще птица?»

gateClasses объединяет их: обнаружения вашего рюкзака сообщаются только тогда, когда модель Apple одновременно слышит одну из перечисленных встроенных категорий. Стая с птицами соответствует этикеткам Apple с птицами, поэтому, если Apple не думает, что там есть птица, ваш рюкзак хранит молчание — независимо от того, насколько он уверен в себе. Эта единственная строка исключает подавляющее большинство ложных сигналов тревоги при музыке, телевидении и тихой комнате, поскольку модель Apple оценивает те, которые находятся намного ниже порога. Оставьте его, и пакет заработает без ограничений (подходит для тестирования, в реальном мире болтлив).

Гейтинг доступен только в том случае, если у Apple уже есть категория рядом с вашим звуком. Если ваш пакет предназначен для чего-то, чего модель Apple класса ~300 не знает — конкретного заводского устройства, звукового сигнала медицинского устройства, пользовательского дверного звонка — встроенной метки для входа нет, поэтому вы оставляете gateClasses выключенным, и пакет работает без блокировки. Это ожидаемо, это не ошибка. Для этих пакетов ваш класс Background перестает быть одной защитой среди нескольких и становится единственным, что стоит между вами и постоянными ложными оповещениями — поэтому вложите в него значительные средства (много реальных эмбиентных записей) и поднимите пороговые значения для каждого класса.

Приобретите упаковку птиц на общих этикетках с птицами Apple, а также на любых конкретных птицах, которые может назвать ваша модель: bird, fowl, bird_vocalization, bird_chirp_tweet, bird_squawk, bird_flapping — и, если в вашей упаковке есть соответствующие виды, crow_caw и pigeon_dove_coo. Другие типы пакетов выбирают свои собственные ворота из [полного списка встроенных звуковых идентификаторов] (#appendix-built-in-sound-identifiers-ios-265) в приложении ниже — например. пакет пород собак выходит на dog_bark/dog_howl, пакет транспортных средств на engine/truck.

muteClasses — положитесь на Apple в отношении звуков, которые ваша модель не может назвать

gateClasses открывает вашу упаковку, когда Apple думает, что там птица. Но Apple может конкретно назвать некоторых птиц, которых ваша модель не может охватить — утку, гуся, сову, индейку, курицу или петуха. Если Apple слышит утку, а в вашей стае нет класса утки, ваша модель принудительно отсортирует этого кряканья по ближайшему виду и уверенно назовет его не той птицей. Это ошибочная идентификация, а не ложная тревога из-за тишины — и один только gateClasses ее не остановит, потому что утка также подрывает обычные ворота bird.

muteClasses исправляет это: когда Apple уверена в одном из этих ярлыков, ваша упаковка на этот момент хранит молчание и подчиняется конкретному требованию Apple. Перечислите встроенные ярлыки для звуков, которые вы не каверуете:

"muteClasses": ["owl_hoot", "duck_quack", "goose_honk", "turkey_gobble", "chicken", "chicken_cluck", "rooster_crow"]

Эмпирическое правило: конкретная этикетка птицы Apple указывается в gateClasses, если ваша модель имеет соответствующий (или лучший) класс для нее, и в muteClasses, если это не так. Все, что Apple может назвать, но вы не можете → отключить звук, и пусть Apple будет права.

Шаг 4 — Напишите profiles.json (необязательно, рекомендуется)

Это контролирует, как каждый звук выглядит и ощущается в приложении — одна запись для каждого класса, привязанная к точному имени папки/метки:

{
  "Mourning_Dove": {
    "displayName": "Mourning Dove",
    "hapticCount": 1,
    "emergencyTier": "none",
    "category": "animal",
    "icon": "bird",
    "color": "teal",
    "threshold": 0.5,
    "maxRange": 150
  },
  "House_Finch": {
    "displayName": "House Finch",
    "hapticCount": 1,
    "category": "animal",
    "icon": "bird"
  },
  "Background": {
    "category": "ignored",
    "threshold": 1.1
  }
}

Каждый ключ является необязательным — опустите что-либо, и будет применено разумное значение по умолчанию:

Ключ Что он делает По умолчанию
displayName Имя отображается на карте и в оповещениях Этикетка с подчеркиванием → пробелы с заглавной буквы
hapticCount Вибрация пульсирует при первом воспроизведении звука (0 = нет) 0
emergencyTier "none" для нормальных звуков. Оставьте "none", если звук действительно не требует срочного оповещения "none"
category Группировка: animal, vehicle, medium, quiet или misc misc
icon Имя SF Symbols, например bird, pawprint, fan, bell waveform
color Оттенок точек/значков: red, blue, cyan, pink, brown, mint, orange, gray, teal, purple или "r,g,b" со значениями 0–1 teal
threshold До того, как зарегистрируется звук, требуется уверенность (0–1). Поднимите его, если класс выдаст ложную тревогу; опустите его, если он пропущен 0.5
maxRange Ориентировочная максимальная дальность обнаружения, указанная на карте, в футах 150

Для вашего класса Background требуется специальная запись, показанная выше: "threshold": 1.1 делает невозможным отчет (достоверность никогда не превышает 1,0), поэтому он бесшумно поглощает окружающий звук, а не появляется в качестве обнаружения. Не опускайте его просто так — класс, не указанный в списке, по-прежнему получает пороговое значение по умолчанию 0,5 и будет отображаться в приложении как общий звук.

Шаг 5 — Заархивируйте его

Выберите три файла — pack.json, profiles.json, model.mlmodel — щелкните правой кнопкой мыши и выберите Сжать. Вместо этого также работает сжатие прилагаемой папки; приложение смотрит на одну папку глубже.

MyPack.zip
├── pack.json
├── profiles.json
└── model.mlmodel

Загрузите zip-архив на свой iPhone любым удобным для вас способом: AirDrop, iCloud Drive, «Почта», «Сообщения».

Шаг 6 — Импортируйте на свой iPhone

  1. Откройте Vigilant Ear → меню шестеренки → Power Pack+.
  2. Прокрутите до пункта Пользовательские звуковые пакеты (BYOM) и нажмите Импортировать пользовательский пакет (.zip).
  3. Выберите свой почтовый индекс в браузере Files.

Пакет появится в списке со своим количеством звуков, уже имеющим статус LIVE. Отсюда вы можете:

Обнаруженные звуки отображаются так же, как и любые другие: точка на карте с вашим значком и цветом, отображаемое имя в оповещениях и настроенные вами тактильные ощущения.

Несколько встроенных функций, о которых следует знать: обнаружения пользовательских пакетов не передаются узлам сетки Constellation (на других телефонах ваш пакет не будет установлен), а звуки пакетов требуют двух последовательных обнаружений перед оповещением, что фильтрует однокадровые ложные срабатывания.

Поиск неисправностей

Сообщение/симптом Причина и исправление
«В архиве pack.json не найден» Файлы zip-архива вложены более чем в одну папку, или pack.json назван неправильно. Перезаархивируйте три файла на верхнем уровне.
«Не удалось прочитать pack.json» Синтаксическая ошибка JSON — отсутствует запятая или кавычка. Подтвердите его (например, вставьте в средство проверки JSON) и повторно заархивируйте.
«Не найден model.mlpackage или model.mlmodel» Файл модели имеет другое имя. Переименуйте его именно в model.mlmodel (или model.mlpackage).
«Модель не является классификатором звука…» Модель не является моделью Create ML Sound Classification — модели изображений, текста и таблиц использовать нельзя. Переобучайтесь с помощью шаблона Sound Classification.
Пакет импортируется, но звук не срабатывает Его уверенность не достигает порога. Уменьшите threshold этого класса (попробуйте 0.35) и добавьте более разнообразные тренировочные ролики.
Звук постоянно срабатывает при окружающем шуме, музыке или телевизоре Добавьте gateClasses к pack.json (см. выше) — это, безусловно, самый большой рычаг. Также добавьте/расширьте класс Background записями окружающей среды, вызывающей нарушения, затем переобучите и повторно импортируйте. Повышение класса threshold (например, 0.8) тоже помогает.
Настоящие звуки распознаются, но есть и неправильные Уже требуются два последовательных обнаружения, и gateClasses фильтрует большую часть шума. Для отстающих подтолкните threshold этого конкретного класса к 0.85–0.9.
Названия/тактильные характеристики profiles.json не применяются Ключи в profiles.json должны точно соответствовать меткам классов модели (именам ваших учебных папок), включая регистр и символы подчеркивания.

Обновление пакета

Переобучить или отредактировать, перезаархивировать и снова импортировать с того же id в pack.json — старая версия заменяется на место.


Приложение: встроенные идентификаторы звуков (iOS 26.5)

(iOS 26.5)

Это встроенные категории звуков, которые распознает встроенный в устройство Apple классификатор Sound Analysis — метки, доступные для gateClasses и muteClasses выше. Apple больше не публикует этот список на своем сайте разработчиков, поэтому таблица ниже была прочитана непосредственно из классификатора на устройстве (SNClassifierIdentifier.version1).

Известные классификации по состоянию на июль 2026 г. (iOS 26.5) — 303 метки. Apple может добавлять, удалять или переименовывать их в любом обновлении ОС, поэтому воспринимайте это как снимок на определенный момент времени: блокировка метки, которую удаляет будущая ОС, просто означает, что ворота никогда не срабатывают (ваш пакет остается безмолвным), и вновь добавленная метка не будет существовать, пока вы ее не активируете. Используйте точное написание (строчные буквы, подчеркивание).

# Identifier Identifier Identifier Identifier
1 accordion crowd humming singing_bowl
2 acoustic_guitar crumpling_crinkling insect sink_filling_washing
3 air_conditioner crushing keyboard_musical siren
4 air_horn crying_sobbing keys_jangling sitar
5 aircraft cutlery_silverware knock skateboard
6 airplane cymbal laughter skiing
7 alarm_clock didgeridoo lawn_mower slap_smack
8 ambulance_siren disc_scratching lion_roar slurp
9 applause dishes_pots_pans liquid_dripping smoke_detector
10 artillery_fire dog liquid_filling_container snake_hiss
11 babble dog_bark liquid_pouring snake_rattle
12 baby_crying dog_bow_wow liquid_sloshing snare_drum
13 baby_laughter dog_growl liquid_splashing sneeze
14 bagpipes dog_howl liquid_spraying snicker
15 banjo dog_whimper liquid_squishing snoring
16 basketball_bounce door liquid_trickle_dribble speech
17 bass_drum door_bell mallet_percussion squeak
18 bass_guitar door_slam mandolin steel_guitar_slide_guitar
19 bassoon door_sliding marimba_xylophone steelpan
20 bathtub_filling_washing double_bass mechanical_fan stream_burbling
21 battle_cry drawer_open_close microwave_oven subway_metro
22 bee_buzz drill mosquito_buzz synthesizer
23 beep drum motorboat_speedboat tabla
24 bell drum_kit motorcycle tambourine
25 belly_laugh duck_quack music tap
26 bicycle electric_guitar nose_blowing tearing
27 bicycle_bell electric_piano oboe telephone
28 bird electric_shaver ocean telephone_bell_ringing
29 bird_chirp_tweet electronic_organ orchestra theremin
30 bird_flapping elk_bugle organ thump_thud
31 bird_squawk emergency_vehicle owl_hoot thunder
32 bird_vocalization engine percussion thunderstorm
33 biting engine_accelerating_revving person_running tick
34 blender engine_idling person_shuffling tick_tock
35 boat_water_vehicle engine_knocking person_walking timpani
36 boiling engine_starting piano toilet_flush
37 booing eruption pig_oink toothbrush
38 boom finger_snapping pigeon_dove_coo traffic_noise
39 bowed_string_instrument fire playing_badminton train
40 bowling_impact fire_crackle playing_hockey train_horn
41 brass_instrument fire_engine_siren playing_squash train_wheels_squealing
42 breathing firecracker playing_table_tennis train_whistle
43 burp fireworks playing_tennis trombone
44 bus flute playing_volleyball truck
45 camera fly_buzz plucked_string_instrument trumpet
46 car_horn foghorn police_siren tuning_fork
47 car_passing_by fowl power_tool turkey_gobble
48 cat french_horn power_windows typewriter
49 cat_meow frog printer typing
50 cat_purr frog_croak race_car typing_computer_keyboard
51 cello frying_food rail_transport ukulele
52 chainsaw gargling railroad_car underwater_bubbling
53 chatter gasp rain vacuum_cleaner
54 cheering giggling raindrop vehicle_skidding
55 chewing glass_breaking rapping vibraphone
56 chicken glass_clink ratchet_and_pawl violin_fiddle
57 chicken_cluck glockenspiel rattle_instrument water
58 children_shouting gong reverse_beeps water_pump
59 chime goose_honk ringtone water_tap_faucet
60 choir_singing guitar rooster_crow waterfall
61 chopping_food guitar_strum rope_skipping whale_vocalization
62 chopping_wood guitar_tapping rowboat_canoe_kayak whispering
63 chuckle_chortle gunshot_gunfire sailing whistling
64 church_bell gurgling saw whoosh_swoosh_swish
65 civil_defense_siren hair_dryer saxophone wind
66 clapping hammer scissors wind_chime
67 clarinet hammond_organ screaming wind_instrument
68 click harmonica scuba_diving wind_noise_microphone
69 clock harp sea_waves wind_rustling_leaves
70 coin_dropping harpsichord sewing_machine wood_cracking
71 cough hedge_trimmer sheep_bleat writing
72 cow_moo helicopter shofar yell
73 cowbell hi_hat shout yodeling
74 coyote_howl hiccup sigh zipper
75 cricket_chirp horse_clip_clop silence zither
76 crow_caw horse_neigh singing

Wingdings, Inc.

© 2026 Wingdings, Inc.
All rights reserved.
Patent Pending