Пользовательские звуковые пакеты — как создать и импортировать свои собственные
Vigilant Ear может изучать новые звуки. Пользовательский звуковой пакет учит приложение распознавать звуки, которые не знает встроенный детектор Apple — местные птицы, конкретная работающая машина, странный зуммер в коридоре вашего здания. Вы обучаете небольшую модель на Mac (программировать не нужно), упаковываете её в zip с двумя небольшими текстовыми файлами и импортируете на iPhone.
Пользовательские пакеты накладываются поверх встроенного детектора. Включение пакета никогда не выключает ничего другого — сирены, сигнализации и все остальные звуки безопасности продолжают работать точно так же, как и раньше.
Вам понадобится: Mac с приложением Xcode Create ML (бесплатно), аудиозаписи ваших звуков и Power Pack+ на вашем iPhone (бесплатная пробная версия засчитывается).
Жесткие требования — сделайте их правильно
Пакет, который игнорирует любой из них, будет импортирован, но будет вести себя плохо (постоянные ложные оповещения или ничего не обнаружено). Это не предложения:
- Включите класс
Background— обязательно, а не по желанию. Ваша модель должна иметь класс, рассчитанный на реальные условия окружающей среды (тихая комната, улица, работающий вентилятор). Заполните его 15+ реальными записями и отметьте"category": "ignored"и"threshold": 1.1вprofiles.json. Без класса Background ваш рюкзак будет постоянно срабатывать в тишине — классификатор звука вынужден выбирать один из своих классов для каждого момента звука, поэтому без сегмента «Ничего из этого» он помечает вашу тихую комнату как то, на что она больше всего похожа. - Удалите тишину из обучающих видеороликов. Клип с надписью «Сова», представляющий собой 20 секунд тишины с одним уханьем, учит модель тому, что молчание — это сова. Обрезайте клипы точно по целевому звуку, иначе модель запомнит пробелы.
- Назовите файл модели точно
model.mlmodelилиmodel.mlpackage. Любое другое имя → импорт невозможен. - Используйте модель Create ML Sound Classification. Модели изображений, текста и таблиц отклоняются.
- Ключи
profiles.jsonдолжны точно соответствовать меткам классов модели, т. е. именам папок обучения, включая регистр и символы подчеркивания. - Добавьте
gateClasses(см. ниже). Без этого музыка и телевидение вызовут стаю. Это самый крупный контроль ложной тревоги. - Заархивируйте файлы на верхнем уровне (или внутри одной папки — не глубже).
pack.jsonдолжен быть доступен для поиска. - Сбалансируйте занятия. Не давайте одному классу 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
Советы, которые действительно изменят ситуацию:
- Всегда включайте класс
Background. Модель должна помечать каждый момент звука как что-то — без фонового класса тишина и уличный шум будут проникать в ваши реальные классы, и вы увидите ложные оповещения. Запишите места, где вы на самом деле будете использовать рюкзак: ваш двор, цех, кухня. - Имена папок становятся метками, отображаемыми в приложении (подчеркивания превращаются в пробелы:
Mourning_Dove→ «Траурный голубь»). Вы можете переопределить отображаемые имена позже вprofiles.json. - Чем больше разнообразия, тем больше длина: разные расстояния, время суток и фоновые условия. Ролики по несколько секунд каждый — это нормально.
- Работают общие форматы (.m4a, .wav, .mp3, .aiff).
Шаг 2 — Обучение модели в Create ML
- Откройте Create ML (на Mac с Xcode: меню Xcode → Открыть инструмент разработчика → Create ML) и создайте новый проект Sound Classification.
- Перетащите папку
TrainingDataв Обучающие данные. - Нажмите Обучить. Несколько сотен клипов обучаются за считанные минуты.
- Проверьте вкладку «Точность» — если один класс получает плохие оценки, ему нужны более или более разнообразные клипы.
- На вкладке Вывод нажмите Получить и сохраните модель как
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"]
}
- Требуется
name— он указан в списке пакетов приложения. idидентифицирует пакет для обновлений: повторный импорт пакета с тем жеidзаменяет старую версию. Подойдет любая уникальная строка в стиле обратного DNS.classes— это только документация. Приложение считывает истинный список классов из самой модели, поэтому несовпадение ничего не сломает (оно просто отмечено в журнале).gateClasses(необязательно, настоятельно рекомендуется) — единственный наиболее эффективный инструмент для предотвращения ложных срабатываний. См. ниже.
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
- Откройте Vigilant Ear → меню шестеренки → Power Pack+.
- Прокрутите до пункта Пользовательские звуковые пакеты (BYOM) и нажмите Импортировать пользовательский пакет (.zip).
- Выберите свой почтовый индекс в браузере Files.
Пакет появится в списке со своим количеством звуков, уже имеющим статус LIVE. Отсюда вы можете:
- LIVE / OFF — переключить пак, не удаляя его. Выкл. Расходы на нулевую батарею.
- Удалить — запускает 5-секундный обратный отсчет (нажмите еще раз, чтобы отменить), затем полностью удаляет пакет.
- Импортируйте столько пакетов, сколько захотите; все они работают рядом со встроенным детектором. Каждый дополнительный активный аккумулятор требует определенного заряда батареи, поэтому отключайте аккумуляторы, которые вы не используете.
Обнаруженные звуки отображаются так же, как и любые другие: точка на карте с вашим значком и цветом, отображаемое имя в оповещениях и настроенные вами тактильные ощущения.
Несколько встроенных функций, о которых следует знать: обнаружения пользовательских пакетов не передаются узлам сетки 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 |

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