В бете Telegram для macOS к диктовке — набору сообщения голосом прямо в поле ввода — добавили исправление надиктованного текста ИИ-редактором. В сборке 13.1.0.283431 от 1 ноября есть кнопка «Enhance» с пунктами «Fix Grammar», «Enhance Style» и «AI Editor…», переключатель автоматической пунктуации и настройка того, что делает в поле ввода ⌘R: диктует текст или записывает голосовое. Сама диктовка лежит в открытом коде клиента, но включена там только в отладочных сборках, а исправления ИИ в открытом коде нет совсем. Касается это тех, кто пишет с Mac. В открытом коде речь распознаёт встроенный распознаватель Apple, а в бете появился запасной путь через серверы Telegram — с бесплатным лимитом, сверх которого нужен Premium.

Что появилось в бете

Диктовка в клиенте для macOS устроена как продолжение записи голосового: нажав кнопку записи, не отпускайте мышь и потяните влево — подсказка внизу так и пишет, «← Swipe to dictate». Сдвиг влево должен быть больше, чем вверх, иначе запись просто закрепится. Вместо голосового сообщения речь превращается в текст, а сама запись удаляется. Во время распознавания внизу написано «Transcribing. Click anywhere to stop.»; готовый текст в открытом коде показывается отдельной панелью, откуда его можно отправить сразу или дописать в конец поля ввода и поправить. Язык можно выбрать вручную или оставить «Automatic». О диктовке в бете 283318 писали ещё 15 октября; в Android такую же расшифровку до отправки показывали и убрали.

Новое в бетах с 24 октября (сборка 283377) — исправление того, что надиктовано. Строки 283431:

СтрокаЧто это
«Enhance»кнопка у надиктованного текста; подсказка к ней — «Fix punctuation and grammar in the dictated text»
«Fix Grammar»исправить пунктуацию и грамматику
«Enhance Style»переписать текст в одном из стилей
«AI Editor…»открыть полный ИИ-редактор
«Enhancing…»текст в работе
«Automatic Punctuation»переключатель автоматической пунктуации
«What ⌘R does in the message field. Automatic dictates when the field has text and records a message when it is empty.»настройка ⌘R: при режиме «Automatic» сочетание диктует, если в поле уже есть текст, и записывает голосовое, если поле пустое
«The language you speak while dictating. Automatic uses this chat's language and your system languages.»язык диктовки: «Automatic» берёт язык чата и языки системы

Выбранный стиль клиент запоминает (kChatDictationEnhanceStyle). Судя по пункту «AI Editor…», это те же стили, что у ИИ-редактора в поле ввода, который Telegram выпустил в апреле: исправить грамматику, перевести, переписать в стиле «Formal», «Short», «Zen», «Corp» и других. Подпись к нему в официальном посте — ИИ-функции работают на сети Cocoon.

Видна ли кнопка уже сейчас, по сборке не понять. В открытом коде диктовка выключена в бета- и релизных сборках условием компиляции и работает только в отладочной; включена ли она в 283431, из бинарника не следует, хотя строки и классы на месте.

Что делать

  • Где искать. Бета приходит автообновлением бета-версии Telegram для macOS; список сборок — в фиде обновлений. В стабильной 13.1.0 (283357) от 20 октября движок диктовки уже есть, но строк «Enhance», «Automatic Punctuation» и настройки ⌘R нет, а подсказка при записи — «← Swipe to transcribe».
  • Дать доступ. Диктовке нужны два разрешения macOS: «Системные настройки» → «Конфиденциальность и безопасность» → «Микрофон» и там же «Распознавание речи». Без второго клиент выводит «Telegram needs Speech Recognition access to turn your voice into text».
  • Проверить язык. Если ни один из языков системы не поддерживается распознавателем Apple, диктовка отвечает «Dictation is not available for your current input language.» Язык можно выбрать вручную вместо «Automatic».
  • Помнить про ⌘R. Сейчас ⌘R в Telegram для macOS начинает запись голосового или видеосообщения; в бете у сочетания появится выбор, и в режиме «Automatic» при непустом поле оно начнёт диктовку, а не запись.

Как распознаётся речь

Распознавание в открытом коде целиком на стороне Apple. На macOS 26 клиент берёт новый движок SpeechAnalyzer, если модель языка уже установлена; если нет — начинает её загрузку в фоне, а эту диктовку отдаёт прежнему SFSpeechRecognizer. На более старых системах работает только SFSpeechRecognizer. Запрос помечен как диктовка, и если для языка есть модель на устройстве, клиент требует распознавания только на Mac; на macOS 13 и новее знаки препинания расставляет сам распознаватель.

В режиме «Automatic» язык не угадывается заранее: из языков системы клиент выбирает до двух, которые знает распознаватель Apple, и запускает оба сразу на одном звуке; второй — только если его модель работает без сети. Каждому кандидату считается оценка — половина стабильности текста между обновлениями, половина уверенности распознавателя, плюс небольшая фора первому языку. Через 1,5 секунды после первых распознанных слов побеждает кандидат, опередивший второго на 0,12, а через 3 секунды — лидер в любом случае; проигравший останавливается, дальше звук идёт одному. В бете в этот список добавлен язык самого чата.

В секретных чатах открытый код запускает только распознаватели, которые работают на устройстве. Если для языка такой модели нет, диктовка в секретном чате не начнётся. В обычном чате первый язык может распознаваться и без локальной модели — тогда запись уходит на серверы Apple, как у системной диктовки macOS.

Запасной путь через серверы Telegram

В бете к этому добавлена серверная расшифровка самого Telegram. В журнале клиента есть строки «server fallback selected» и «nativeAvailable», а в бинарнике — метод messages.transcribeAudioFile: он принимает загруженный звуковой файл, а не сообщение, и возвращает текст обычным ответом расшифровки или позже, обновлением updateTranscribedAudioFile. Прежний метод messages.transcribeAudio расшифровывает только голосовое, которое уже лежит в чате, — у неотправленной записи номера сообщения нет. Новый метод и обновление есть в схеме API, выгруженной из бет macOS, но не в опубликованной документации.

Ограничения видны по текстам ошибок беты: запись длиннее 30 минут или больше 1 МБ не расшифровывается, а после бесплатных расшифровок появляется «Your free transcriptions have been used. Telegram Premium is required to transcribe more audio.» В стабильной 13.1.0 ни метода, ни этих строк нет. Как бета выбирает между Apple и сервером Telegram и что делает в секретных чатах, по сборке не видно.

Как проверено

  • Открытый код клиента: движок диктовки (выбор языков, оценка, пороги 1,5 и 3 секунды, requiresOnDeviceRecognition) и контроллер, где проверка isSupported возвращает «да» только в отладочной сборке и требует распознавания на устройстве в секретных чатах. Оба файла пришли в открытый код слиянием ветки релиза 13.1 23 октября.
  • Бинарники из фидов обновлений: бета 283431 и стабильная 283357. Классы ChatDictationEnhancer, ChatDictationEnhanceView, ключи kChatDictationAutomaticPunctuation и kChatDictationShortcut и строки из таблицы есть только в бете; в стабильной есть движок (ChatDictationSession, ChatDictationAnalyzerRecognizer) и восемь строк диктовки, а исправления нет. В файле строк открытого кода пунктов «Enhance» тоже нет.
  • Серверная часть — строки бинарника 283431: AudioFileTranscription, «upload complete, calling transcribeAudioFile», updateTranscribedAudioFile и тексты ошибок; в 283357 их нет.
  • Первое появление ChatDictationEnhancer — дифф бинарника беты 283377, 24 октября.