Назад к разделу Technology

Голосовой ввод в бухгалтерии: где ломается поток

Голосовой ввод способен заменить ручное заполнение в бухгалтерии, и почти ничего из voice-стека 2026 года для этого не нужно. Вот поток, который мы выпустили, четыре места, где он рвётся, и апгрейд модели, стоивший нам определения языка.

Категория
Общее
Обновлено
Автор
Stan Kharlap

С бухгалтерским приложением теперь можно разговаривать. Скажите "сорок евро обед с клиентом вчера, наличными" и получите проведённый расход, или зажмите микрофон и продиктуйте вопрос про срок подачи НДС. Это работает, и это самое неинтересное во всей истории.

Интересно другое: как мало из voice-стека 2026 года для этого нужно и как много сил уходит на вещи, не имеющие отношения к распознаванию речи. Мы выпустили голосовой захват на двух поверхностях, и отказы никогда не были в транскрипте. Они были в пути к файлу, в запросе разрешения, в слишком коротком тапе и в апгрейде модели, который тихо убрал функцию, от которой мы зависели.

Можно ли вести бухгалтерию голосом?

Для захвата и вопросов да. Для команд без присмотра нет, и не потому, что модель их не разберёт.

Речь это способ ввода текста. Это не механизм авторизации. Произнесённая фраза, которая превращается в проводку, обязана пройти через состояние, которое человек может прочитать и поправить, потому что у сданной декларации по НДС нет отмены и потому что транскрипт это ровно то место, где "девятнадцать" становится "девяносто". Обе наши поверхности поэтому делают одно и то же: транскрибируют, показывают текст и дают человеку нажать "отправить". На мессенджерной поверхности бот буквально возвращает услышанное перед тем, как ответить.

Одно это правило снимает с голосовой функции большую часть риска, и оно же объясняет, почему нам не нужны те части индустриального стека, которые сейчас выпускают все.

Два голосовых режима, и какой вам нужен

Есть два способа завести речь в приложение, и это не варианты одного и того же.

Живая диктовкаЗаписанная голосовая заметка
Где идёт распознаваниена устройстве, пока говоритена сервере, после остановки
Результат приходитслово за словомодин раз, целиком
Работа с языкомлокаль надо выбрать заранееопределяется из аудио или из текста
Характер ошибкитекст плывёт, пользователь это видитодна ошибка в конце
Хорошо длядлинного свободного текста, руки на телефонекоротких структурированных фраз, шумных мест

Мы используем оба. Диктовка уместна, когда человек формулирует сообщение и хочет видеть, как оно появляется. Голосовая заметка уместна для "сорок евро обед, наличными", где пользователь говорит одну вещь, останавливается и ждёт результат. Интересная деталь реализации: наш рекордер голосовых заметок использует модуль распознавания на устройстве как записывающее устройство, а не как распознаватель. Он запрашивает микрофон, измеряет уровень для волновой формы и сохраняет аудио, а сам транскрипт приходит от серверной модели. Пишем в 16 кГц, PCM 16 бит, потому что речевые модели хотят именно этого и потому что гнать 48 кГц стерео через мобильную сеть это трата времени всех участников.

Что в голосовом потоке действительно ломается

Четыре вещи, и ни одна из них не модель.

Разрешения, и только на свежей установке. Диктовка запрашивала доступ к микрофону перед стартом, а путь голосовых заметок считал, что доступ уже выдан. На устройстве, где его никогда не выдавали, распознаватель отдавал событие not-allowed, аудиофайл не появлялся вообще, и интерфейс просто стоял. Фикс тривиальный, урок нет: каждая точка входа в аудио должна запрашивать разрешение сама, потому что на твоём тестовом устройстве его выдали неделями раньше.

Аудиофайл существует не тогда, когда ты думаешь. URI записи приходит с событием старта, но нативный writer всё ещё держит файл. Кто читает его в этот момент, получает путь к чему-то незаконченному. Мы держим ранний путь только как запасной и используем его после финального события окончания, когда writer закончил. Если голосовая функция работает в симуляторе и падает на реальном телефоне, проверяйте эту гонку первой.

Тап и отпускание. Кто нажал кнопку записи и сразу отпустил, отправляет заголовок без аудио внутри. Сервис транскрипции справедливо это отклоняет, а наивная реализация сообщает о серверной ошибке, повторяет и падает снова на тех же байтах. Это 4xx, а не 5xx: проблема во вводе, повтор бессмысленен, и правильный ответ это "слишком коротко, попробуйте снова", а не инцидент в трекере ошибок.

Бюджет задержки, который является цепочкой, а не числом. Клиент ограничивает запись двумя минутами. У серверного вызова таймаут восемнадцать секунд, выбранный ниже потолка обработчика запросов в двадцать пять секунд, чтобы медленная транскрипция падала чисто, а не была убита посреди запроса. Выбирайте эти три числа вместе, иначе внешнее решит за вас, и решит так, что выбросит запись после того, как человек говорил девяносто секунд.

Апгрейд модели, стоивший нам определения языка

Это та часть, которую я хотел бы прочитать в чужом постмортеме.

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

Теперь язык берётся из эвристики по стоп-словам поверх полученного текста, и это шаг назад, честный: короткая фраза без стоп-слов не получает языка вовсе, и мы откатываемся на язык интерфейса. Тем временем стриминговые вендоры пошли в противоположную сторону и сделали ровно это заголовком. Flux Multilingual от Deepgram вышел в общую доступность 29 апреля 2026 с десятью языками и динамическим переключением внутри одного разговора, а мультиязычная стриминговая модель AssemblyAI, опубликованная 12 ноября 2025, покрывает шесть языков одной моделью по единой часовой цене независимо от языка.

Это по-настоящему полезно, и в основном не нам. Посмотрите, под что оптимизирован остальной этот стек: Flux построен вокруг понимания того, когда говорящий закончил свою реплику, а AssemblyAI выпустил апгрейд стриминговой диаризации 4 мая 2026. Определение смены реплик и разделение говорящих это сложные задачи живого, прерываемого разговора с несколькими участниками. У потока захвата в бухгалтерии один говорящий, никаких перебиваний и фраза, которая заканчивается, когда палец уходит с кнопки. Покупать под это разговорный стек значит платить за проблему, которой у вас нет.

Как выглядит реальное использование

Одна цифра с прикреплённой оговоркой, потому что маленький честный сигнал я предпочту большому расплывчатому.

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

Второе, что говорят наши данные, касается собственной инструментации. В чат-таблицах произнесённое сообщение неотличимо от набранного, потому что мы храним транскрипт. Для приватности это правильно, для продуктовых решений неудобно: мы не можем ответить, сколько проводок начались с речи, не добавив флаг, который мы так и не добавили. Если вы это строите, пишите источник на сообщение до релиза, а не когда цифра понадобилась.

Частые вопросы

Как перестать вбивать данные о расходах вручную?

Фиксируйте в момент траты, а не одной месячной сессией, и берите тот ввод, который быстрее для ситуации: фото, когда есть документ, голос, когда документа нет. Произнесённая фраза "сорок евро обед с клиентом, наличными" несёт сумму, подсказку категории и способ оплаты на одном дыхании, и это быстрее любой формы. Дальше подтвердите разобранный результат, потому что правка это единственный оставшийся ручной шаг.

Можно ли провести расход голосом на немецком?

Да, и проверять надо работу с языком, а не качество распознавания. Современная транскрипция справляется с немецким, включая числа и валюту; ломается там, где приложение отвечает не на том языке или нормализует десятичную запятую в точку. Спросите вендора, что происходит с короткой фразой, язык которой отличается от языка интерфейса, потому что именно этот случай ломается тихо.

Достаточно ли голосовой ввод точен для сумм в бухгалтерии?

Достаточно точен, чтобы предложить, но не чтобы сдать без присмотра. Суммы и даты возвращаются надёжно, но "девятнадцать" и "девяносто" в нескольких языках отличаются на одну гласную, и транскрипт это место, где это схлопывается. Любой голосовой поток, касающийся налоговых записей, должен показывать разобранные значения на подтверждение перед записью, и это заодно даёт чистый аудиторский след, кто одобрил проводку.

Что происходит с аудиозаписью потом?

В нашем потоке запись загружается, транскрибируется, а локальный файл после этого удаляется, так что остаётся текст, а не аудио. Об этом стоит прямо спросить любого вендора, потому что голосовые заметки о деловых расходах регулярно содержат имена третьих лиц, а аудио, оставленное "для контроля качества", это копия персональных данных, которую можно было не оставлять. В своих трейсах модели мы держим ту же позицию, там лежит хеш вместо полезной нагрузки.

Работает ли голосовой ввод без интернета?

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

Заключение

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

Стратегическое здесь это знать, какие части voice-стека 2026 года пропустить. Определение смены реплик, диаризация и динамическое переключение языка это правильные вложения для разговорного агента на телефонном звонке. Для человека, который стоит у ресторана и говорит "сорок евро, обед, наличными", правильное вложение это запись, которая надёжно доходит до транскрипта, транскрипт, который человек видит, и кнопка отправки, которую он нажимает сам. Ту же дисциплину мы заложили в сбор недостающих документов, и здесь она держится так же: интересная инженерия почти никогда не в модели.

Norman берет операционную финансовую работу на себя

От invoicing до bookkeeping: Norman организует повторяющиеся финансовые процессы так, чтобы вы успевали к дедлайнам с меньшим объемом ручной работы.