Как прислать диагностическую запись

Как записать то, что пошло не так, и передать это тому, кто сможет в этом разобраться.

Жалобу вроде «меня обрезало на полуслове» по одному описанию не разобрать. В записи есть и звук, и решение, которое тракт шумоподавления принял для каждых 10 мс этого звука. В этом и разница: неполадку можно прочитать, а не гадать о ней.

Запишите неполадку

  1. Откройте Диагностику — значок осциллограммы на панели инструментов.
  2. Разверните карточку Запись для диагностики и включите переключатель.
  3. Поезжайте и добейтесь, чтобы неполадка повторилась. Говорите так же, как в тот раз, на той же скорости и с той же гарнитурой.
  4. Выключите переключатель.

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

Пишется ваш микрофон. Не разговор и не другие участники — именно ваш микрофон, таким, каким его слышит приложение. Всё сказанное при включённой записи попадёт в файл, так что выключайте её, как только получите нужное.

Сначала послушайте

Прежде чем что-то отправлять, послушайте: кнопка Прослушать в карточке записи открывает осциллограмму с ползунком, который можно тащить или ставить касанием. Это запись вашего голоса, и лучше знать, что в неё попало. А если отправлять звук не хочется совсем — и не надо, см. ниже.

Услышать то же, что слышали остальные

Запись — это ваш микрофон, и так задумано: копия снимается до того, как её коснётся шумоподавление, поэтому в файле то, что услышал телефон, а не то, что из этого сделало приложение. Хранить нужно именно это — но ответить по такому файлу на вопрос «а так ли меня слышали остальные?» нельзя. На него отвечают две кнопки рядом с воспроизведением.

Зелёные участки осциллограммы — то, что ушло на сервер; всё остальное записалось, но в эфир не пошло.

Кнопка Что делает
Зелёная — говорящий человек Проигрывает только зелёные участки, проматывая всё, что отсёк гейт. Что именно ушло — по журналу решений, принятых тогда же.
Жёлтая — полоски уровня Проигрывает через шумоподавление: слышно обработку, которой подвергся голос, а не сырой микрофон.

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

Так быстрее всего ответить на главный вопрос: меня оборвало или только показалось? Если слова пропадают там — значит, они пропали у всех.

Если зелёного в записи нет совсем, под осциллограммой появится строка с причиной — обычно это выключенный микрофон или режим «По нажатию», в котором кнопку так и не нажали.

Развёрнутая карточка записи: сколько файлов сохранено и сколько
              они занимают, маленькая красная кнопка удаления у левого края и
              кнопки прослушивания и отправки у правого.
В развёрнутом виде: что сохранено и что с этим можно сделать.
Панель прослушивания: по кнопке на каждую запись, осциллограмма,
              зелёные участки которой ушли на сервер, красный ползунок в
              начале, два переключателя воспроизведения — залитые зелёным и
              жёлтым — и время с миллисекундами.
Послушать перед отправкой. Зелёное — то, что ушло; ползунок можно тащить, ставить касанием или менять масштаб щипком.

Отправьте

Кнопка отправки складывает всё в один или несколько файлов .zip, каждый меньше 18 МБ, чтобы они прошли куда угодно.

Самый быстрый способ спросить

Сервер в Discord — это место, где можно рассказать, что пошло не так, и выяснить, что именно присылать. Там же быстрее всего узнать имя телеграм-бота: сам архив удобнее всего отправлять через него.

Не выкладывайте архив в канал Discord. Это запись вашего собственного микрофона, а канал — это другие люди. Сначала спросите, потом отправляйте туда, куда скажут.

Если вы уже на связи с разработчиком

Отправьте архив телеграм-боту: он сам распакует, преобразует и разложит всё по папкам. Имя бота спросите у разработчика.

Иначе — общий путь

  1. Положите архив туда, где вы и так храните файлы: облако, Dropbox, WeTransfer или письмо самому себе.
  2. Заведите issue на github.com/zavitax/mumbleway/issues.
  3. Дайте ссылку и напишите, что пошло не так и примерно на какой минуте записи.

Не прикладывайте звук к самому 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 Гц.

Что с ней происходит потом

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