Для записи диалогов разработано мобильное приложение для Android и iOS по выгрузке данных через USB с аудиобейджа на смартфон и далее со смартфона на файловый сервер. Аппаратный аудиобейдж представляет из себя диктофон в корпусе бейджика на пиджаке работника. Бейдж заряжается постоянным током при подключении к USB. Доступ к файлам на диктофоне осуществляется через тот же USB-интерфейс — диктофон работает как обычная флешка. Для подключения диктофона к смартфону необходим кабель-переходник, который поддерживает передачу данных, иначе телефон не обнаруживает внешнее запоминающее устройство. Печально, что некоторые производители указывают, что переходник поддерживает передачу данных, хотя это не так. Нам пришлось перебрать несколько кабелей для Android, прежде чем найти рабочий. В первый раз проблема ввела в ступор: то ли диктофон не работает, то ли в смартфоне проблема, раз устройство не обнаруживается. Для iOS переходник подошел сразу.
В практическом применении неплохо бы учесть индивидуальные особенности человека: кому-то проще воспринимать на слух, а кому-то — письменный текст. Поэтому в софт аудиобейджа планируется встроить автоматическое распознавание речи в текст. При прослушивании аудиозаписи в том же окне приложения будет выдаваться транскрипция диалога с разделением реплик разных собеседников.
Приложение создавалось для двух мобильных платформ. Для Android обычно пишут на Java и Kotlin, для iOS — на Swift. Дабы сэкономить ресурсы выбрали MAUI от Microsoft — кроссплатформенный фреймворк разработки мобильных и настольных приложений. Это следующая итерация старого-доброго Xamarin, который больше не поддерживается.
Немного теории
Аудиофайл с сервера передается в модуль распознавания речи, где подвергается предварительной обработке: фильтрации, подавлению шума и нормализации звука для большей четкости и устранения фонового шума, который может сбивать с панталыку следующие алгоритмы ансамбля. Далее аудио сегментируется на мелкие части, которые анализируют отдельно. Современные системы основываются на рекуррентных нейронных сетях (RNN) и их расширениях, таких как «длинная цепь элементов краткосрочной памяти» (LSTM). Большая база примеров обучает распознаванию акцентов, интонаций и стилевых особенностей речи.
Нейросеть обучают на так называемом «обратном распространении ошибки». После предсказания того, каким могло бы быть текстовое представление аудиосигнала, вычисляется дельта между предсказанным текстом и реальным. Ошибка передается обратно через сеть, а веса нейронов корректируются, чтобы уменьшить ошибку в будущем. Так повторяется много и много раз, пока модель не достигнет приемлемого уровня точности.
Модель принимает аудиосегменты и сопоставляет их с фонемами (фонетическими единицами), преобразуя в слова и фразы. При формировании текстового представления может быть использован алгоритм угадывания слов, которые, вероятнее всего, смогут встать следующими во фразе, что значительно повышает точность распознавания. Для придания натуральности языку модель настраивается на специфичные термины, характерные для контекста или области знания.
Android
В Multi-platform App UI можно писать как общий код, так и платформозависимый через использование директив #if android
и #if ios
. Также через директивы можно указать версии используемой системы на устройстве. Разработка велась итеративно — сначала для Android, потом для iOS, что привело к некоторым проблемам в дальнейшем, такова кроссплатформенная мобильная разработка. Но пойдем по порядку: прежде всего, необходимо было получить доступ к файлам на диктофоне. Android опять усилил безопасность, и приложению Gran QM необходимо запрашивать доступ к любой папке вне файловой «песочницы». Поэтому точно будет платформозависимый код. В Android открываем файловый менеджер, где можно выбрать папку, к которой монтируется корень флешки аудиобейджа.
Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
Microsoft.Maui.ApplicationModel.Platform.CurrentActivity.StartActivityForResult(intent, 1);
Нам нужно выбрать условие, при котором задается корень. Клик по кнопке в качестве условия был не интересен. Во-первых, при старте приложения можно узнать подключенные USB-устройства через UsbManager — для этого дополнительные права не нужны. Тут же можно отфильтровать устройства по производителям, чтобы предотвратить ложные срабатывания из-за подключения обычной флешки. А во-вторых, активировать окно сразу при подключении устройства: не надо вручную писать циклы прослушивания подключений. Класс BroadcastReceiver
умеет реагировать на создание Intent
. Поэтому создаем класс с наследованием от BroadcastReceiver
и в нем фильтруем события подключения и отключения USB-устройств. После этого захваченное аудио по нажатию на большую кнопку копируется во внутреннюю память приложения, в «песочницу», так сказать.
Затем занялись дизайном. Сделали просто, плоско — как вы любите. Пришлось повозиться с созданием большой кнопки посередине экрана, поскольку похожий элемент управления отсутствует в стандартной библиотеке графических элементов. И, забегая вперед, — под iOS изображения в формате PNG отказывались отображаться. Поэтому в проект сразу добавляем SVG, несмотря на то, что Android справляется с обоими форматами.