Жалобу вроде «меня обрезало на полуслове» по одному описанию не разобрать. В записи есть и звук, и решение, которое тракт шумоподавления принял для каждых 10 мс этого звука. В этом и разница: неполадку можно прочитать, а не гадать о ней.
Запишите неполадку
- Откройте Диагностику — значок осциллограммы на панели инструментов.
- Разверните карточку Запись для диагностики и включите переключатель.
- Поезжайте и добейтесь, чтобы неполадка повторилась. Говорите так же, как в тот раз, на той же скорости и с той же гарнитурой.
- Выключите переключатель.
Тридцать секунд с настоящей проблемой полезнее десяти минут спокойной езды. Если она случается через раз, пишите всю поездку: нужный момент потом находится по журналу.
Пишется ваш микрофон. Не разговор и не другие участники — именно ваш микрофон, таким, каким его слышит приложение. Всё сказанное при включённой записи попадёт в файл, так что выключайте её, как только получите нужное.
Сначала послушайте
Прежде чем что-то отправлять, послушайте: кнопка Прослушать в карточке записи открывает осциллограмму с ползунком, который можно тащить или ставить касанием. Это запись вашего голоса, и лучше знать, что в неё попало. А если отправлять звук не хочется совсем — и не надо, см. ниже.
Услышать то же, что слышали остальные
Запись — это ваш микрофон, и так задумано: копия снимается до того, как её коснётся шумоподавление, поэтому в файле то, что услышал телефон, а не то, что из этого сделало приложение. Хранить нужно именно это — но ответить по такому файлу на вопрос «а так ли меня слышали остальные?» нельзя. На него отвечают две кнопки рядом с воспроизведением.
Зелёные участки осциллограммы — то, что ушло на сервер; всё остальное записалось, но в эфир не пошло.
| Кнопка | Что делает |
|---|---|
| Зелёная — говорящий человек | Проигрывает только зелёные участки, проматывая всё, что отсёк гейт. Что именно ушло — по журналу решений, принятых тогда же. |
| Жёлтая — полоски уровня | Проигрывает через шумоподавление: слышно обработку, которой подвергся голос, а не сырой микрофон. |
Включите обе — и останется ровно то, что получил другой конец. Без второго телефона, второй учётной записи и попыток на слух оценить собственный голос.
Так быстрее всего ответить на главный вопрос: меня оборвало или только показалось? Если слова пропадают там — значит, они пропали у всех.
Если зелёного в записи нет совсем, под осциллограммой появится строка с причиной — обычно это выключенный микрофон или режим «По нажатию», в котором кнопку так и не нажали.
Отправьте
Кнопка отправки складывает всё в один или несколько файлов .zip, каждый
меньше 18 МБ, чтобы они прошли куда угодно.
Самый быстрый способ спросить
Сервер в Discord — это место, где можно рассказать, что пошло не так, и выяснить, что именно присылать. Там же быстрее всего узнать имя телеграм-бота: сам архив удобнее всего отправлять через него.
Не выкладывайте архив в канал Discord. Это запись вашего собственного микрофона, а канал — это другие люди. Сначала спросите, потом отправляйте туда, куда скажут.
Если вы уже на связи с разработчиком
Отправьте архив телеграм-боту: он сам распакует, преобразует и разложит всё по папкам. Имя бота спросите у разработчика.
Иначе — общий путь
- Положите архив туда, где вы и так храните файлы: облако, Dropbox, WeTransfer или письмо самому себе.
- Заведите issue на github.com/zavitax/mumbleway/issues.
- Дайте ссылку и напишите, что пошло не так и примерно на какой минуте записи.
Не прикладывайте звук к самому issue. Вложения там публичны и остаются навсегда. Свою ссылку вы всегда можете убрать, а файл в публичном issue — уже нет.
Если отправлять звук не хочется вовсе
Пришлите только файл .csv из архива. Звука в нём нет — одни числа,
двадцать три колонки, по строке на каждые 10 мс поездки. Шла ли передача,
обнаружена ли речь, отношение сигнал/шум, уровень сигнала, уровень шума — и ещё
восемнадцать, перечисленных ниже.
На большинство вопросов этого хватает: закрылся ли гейт, когда именно и на что тракт при этом смотрел. Файл маленький, его можно приложить прямо к issue, и голоса в нём нет — думать не о чем.
Что лежит в архиве
| Файл | Что это |
|---|---|
ГГГГММДД-ЧЧММ-NNN.s16 |
Звук ровно в том виде, в каком его получил тракт: сырой 16-битный PCM, моно, 48 кГц, без заголовка |
ГГГГММДД-ЧЧММ-NNN.csv |
По строке на каждые 10 мс поездки, двадцать три колонки, названные в строке заголовка. Полный список — ниже |
Эти два файла носят одно имя и принадлежат друг другу: звук без журнала — запись, о которой никто ничего не скажет, а журнал без звука сам по себе всё ещё полезен.
Главный столбец — transmitting. В нём то, что действительно ушло в эфир, с
учётом огибающей, режима и выключенного микрофона. Вереница нулей посреди речи
и есть та самая неполадка — видно без всякого прослушивания.
Столбцы mode и muted появились потому, что нули в transmitting бывают и
вовсе не из-за шумоподавления: mode — это 0 для голосовой активации, 1 для
режима «По нажатию» и 2 для непрерывной передачи, а muted — выключенный
микрофон. Запись, из которой ничего не ушло из-за выключенного микрофона, во
всех остальных столбцах неотличима от записи, где ни разу не открылся гейт, —
а это требует прямо противоположных действий.
gain_db — усиление микрофона, и появился он по той же причине. Искажённая
запись может означать и перегруженный вход, и неполадку в тракте, а регулятор,
от которого это зависит, был единственной настройкой приложения, не
оставлявшей следа в файле.
Новые столбцы добавляются в конец и никогда в середину: программа, которая ищет столбцы по имени, продолжает работать, а старые записи остаются читаемыми.
Все столбцы
В том порядке, в каком они идут. В файле есть строка заголовка с их именами, так что искать их стоит по имени, а не по счёту запятых.
| Столбец | Что в нём |
|---|---|
block |
Какие это 10 мс, считая от начала записи |
transmitting |
То, что действительно ушло в эфир, — с учётом огибающей, режима и выключенного микрофона |
speaking |
Вывод самого тракта: это речь |
gate_open |
Был ли открыт гейт, а это не то же самое: гейт может быть открыт на блоке, который тракт речью не считает |
vad |
Собственная вероятность от RNNoise, от 0 до 1, до того как к ней применят две другие проверки |
snr_db |
Насколько блок поднимается над измеренным фоном |
level_db |
Уровень, по которому судит гейт, — измеренный после шумоподавления |
floor_db |
Фон, в котором тракт себя считает |
harmonicity |
Насколько блок периодичен на человеческой высоте тона, от 0 до 1. Именно это отсекает громкий мотор: частота его вспышек лежит ниже той полосы, в которой ищут |
modulation |
Меняется ли громкость в последнее время с речевой частотой. Измеряется и записывается, но ничего по ней не решается — она здесь для того, чтобы на неё смотрели, а не потому, что действует |
mode |
0 — по голосу, 1 — по нажатию, 2 — непрерывно |
muted |
Выключен ли микрофон |
gain_db |
Усиление микрофона, на каждый блок, потому что ползунок можно двинуть по ходу поездки |
echo_ref_samples |
Сколько опорного сигнала досталось эхоподавителю на этом блоке. 480 — полный блок; 0 — не досталось ничего, и убрать эхо было нечем; всё, что между, — это опустевшая посреди блока очередь, из-за которой в опорный сигнал вклеивается тишина и сдвигается всё выравнивание после неё |
aec_on |
Было ли подавление эха включено вообще |
erle_db |
Сколько эхоподавитель убрал |
aec_lag_ms |
Где он считает эхо — насколько оно отстаёт от опорного сигнала |
aec_confidence |
Насколько это измерение убедительно, от 0 до 1. Читать в паре с задержкой: выравнивание намеренно берёт чуть раньше, поэтому малая задержка — это работающий замысел, а вот уверенность, которая не растёт, означает, что эхо не найдено вовсе |
aec_spread_ms |
Насколько разошлись приходы. Шире, чем охват самого фильтра, — значит есть второе эхо, до которого он не дотягивается |
aec_taps |
Длина фильтра в отводах; лестница производительности её укорачивает. При aec3 = 1 смысла не имеет — у AEC3 такой ручки нет |
aec3 |
Какой эхоподавитель дал этот блок: 1 — AEC3, 0 — фильтр во временной области. Ломаются они по-разному, поэтому запись, которая не может сказать, откуда она, не читается вообще |
profile |
Профиль подавления, который действительно работал: 0 — выключено, 1 — слабое, 2 — обычное, 3 — шлем. Никогда «Автоматически» — это правило выбора, а записывается то, через что звук прошёл |
route |
С какого микрофона он пришёл: 0 — неизвестно, 1 — собственный микрофон телефона, 2 — проводная гарнитура, 3 — Bluetooth hands-free, то есть узкополосный, 4 — USB или док, 5 — что-то ещё, названное системой |
Числа в mode, profile и route — это формат на проводе, и их не
перенумеровывают. Записи, которые уже лежат у людей в телефонах, читаются с
теми значениями, что выше, а у программы, написанной через полгода, других
сведений не будет. Новые значения получают следующий свободный номер.
Про route стоит знать даже тому, кто файл не откроет. Он появился потому, что
папка записей с собственного микрофона телефона выглядит точно так же, как папка
с гарнитуры, — и однажды из-за этого пришлось выбросить целый круг измерений. До
этого столбца ответ приходилось выводить из полосы самого звука: Bluetooth
hands-free обрывается на 3,4 кГц, а встроенный микрофон дотягивает до 16, — это
работало и было спектральным анализом вместо одной цифры.
Как проиграть звук самому
У .s16 нет заголовка, поэтому обычный проигрыватель его не откроет.
Подскажите программе, что это:
ffplay -f s16le -ar 48000 -ac 1 20260808-1139-000.s16
Или преобразуйте во что-нибудь обычное:
ffmpeg -f s16le -ar 48000 -ac 1 -i 20260808-1139-000.s16 ride.wav
Audacity тоже его импортирует: Файл → Импорт → Импорт необработанных данных (Import Raw Data), затем знаковый 16-битный PCM, little-endian, 1 канал, 48000 Гц.
Что с ней происходит потом
Ничего само собой не происходит. Серверов у приложения нет, никуда оно ничего не выгружает, и разработчик получает ровно то, что вы решили отправить, и туда, куда выбрали сами. Подробнее — в политике приватности.