Цього тижня вийшов SyncTrans 1.0.0. Це перекладач мовлення в реальному часі для macOS 14 і новіших версій, який працює на Apple Silicon: ви говорите, переклад з'являється в міру того, як складається речення, а синтезований голос озвучує його. Ця стаття — інженерна розповідь про те, як ми до цього дійшли — що ми збудували, в якому порядку і на які компроміси погодилися. Короткі нотатки для користувачів живуть у розділі Оновлення.
Навіщо робити перекладача для Mac
Застосунки для перекладу на телефонах добре справляються з питанням, де туалет. Зі справжньою розмовою вони працюють значно гірше, бо перетворюють її на двох людей, які по черзі витріщаються на маленький екран і передають пристрій одне одному. А в розмовах, які нас цікавили — зустріч із клієнтом, консультація, сімейна розмова з юристом чи лікарем — на столі набагато частіше лежить ноутбук, аніж розмовник.
До того ж Mac виявився незвично вдалим залізом для цього завдання. Apple Silicon може виконувати розпізнавання мовлення, машинний переклад і синтез мовлення локально, з інтерактивною швидкістю, а сама машина вже має гарний шлях мікрофона, справжні динаміки й скільки завгодно дисплеїв, які можна підключити. Мета, яку ми перед собою поставили, звучала просто: машина займається мовою, щоб люди могли займатися розмовою.
Два сімейства рушіїв, розроблені паралельно
Від першого прототипу в SyncTrans було два способи робити одну й ту саму роботу. Керований хмарний рушій не потребує жодного налаштування: увійди, вибери мови, починай. Локальний рушій виконує розпізнавання, переклад і синтез цілком на Mac — ніщо не покидає машини, і він продовжує працювати без мережі.
Ми свідомо будували обидва напрями одночасно, а не випускали спочатку хмарний шлях, щоб потім прикручувати локальний інференс збоку. Ціна була реальною: кожна функція мала працювати двічі, поверх двох дуже різних стеків. Виграш — єдина абстракція рушія, до якої підключаються обидва стеки, і звичка вимірювати замість стверджувати. Кожен рівень локальної моделі має виміряну нижню межу пам'яті, і застосунок перевіряє, що машина справді здатна виконати, перш ніж пропонувати це — старішому Mac чесно кажуть, які рівні для нього недосяжні, замість того щоб відправляти його туди, де все піде в swap.
Третій варіант рушія випав із цієї абстракції майже безкоштовно: якщо у вас уже є сервіси розпізнавання мовлення та перекладу, яким ви довіряєте, можна направити SyncTrans на власні API-ендпоінти, і решта застосунку працюватиме без змін. Три рушії, один інтерфейс, а перемикання між ними — це вибір у налаштуваннях, а не перевстановлення.
Дизайн під сценарій віч-на-віч
Функція, що найсильніше сформувала продукт, народилася зі спостережень за людьми, які користувалися ранніми збірками. Маючи одне вікно, двоє співрозмовників неминуче повертали екран туди-сюди. Тому 1.0 постачається з двоекранним виглядом розмови: виведіть по одній мові на весь екран на кожному дисплеї, поставте Mac між співрозмовниками, і кожен читатиме екран, призначений для нього. Кожне вікно можна призначити власному дисплею прямо з застосунку.
Аудіо отримало таке саме ставлення. Зі спільною парою навушників SyncTrans може надсилати одну мову в ліве вухо, а іншу — в праве, тож двоє людей, які ділять один Mac, кожен чує переклад, призначений для нього. Описати це просто, а на практиці ефект на диво великий: розмова взагалі перестає бути про машину.
Три макети над одним записом сесії
Різні моменти потребують різних виглядів тієї самої розмови, тому 1.0 постачається з трьома макетами над єдиним записом сесії. Макет чату чергує обидві мови репліка за реплікою, як це робить месенджер. Двоколонковий макет дає кожній мові власну колонку, що читається краще, коли двоє стежать за розмовою одночасно. Макет протоколу наради подає сесію як суцільний документ, який можна переглядати, як нотатки. Оскільки макети — це вигляди над одним записом, перемикання посеред сесії нічого не втрачає.
Глосарій, контекст і числа, що поводяться правильно
Дві функції якості потрапили в 1.0, бо вони важливіші за сам вибір моделі. Переклад працює зі ковзним контекстом розмови, тому займенники та відсилання до теми розв'язуються відносно того, що справді було сказано раніше в сесії. Глосарій проєкту закріплює слова, які модель інакше вгадувала б: назви продуктів, імена людей, технічні терміни. Щойно термін опиняється в глосарії, він щоразу виходить однаково.
1.0 також містить детермінований шар правил, що стоїть за моделлю для чисел і формулювань знижок, де дослівний переклад може непомітно перевернути зміст — китайські угоди про знижки є знаменитим випадком. Ця робота має власну статтю: Числа, які виживають у перекладі.
Історія, в якій можна шукати й яку можна експортувати
Перекладена розмова часто потрібна вам пізніше, тому кожна сесія зберігається в межах проєкту на Mac. В історії можна шукати по всіх проєктах, окремі репліки можна виправляти чи видаляти, а завершена сесія експортується як TXT, Markdown або SRT — нотатки наради, цитата, яка потрібна в письмовому вигляді, або субтитри до запису тієї самої події. Запис живе на вашій машині, незалежно від того, який рушій його створив.
Сім мов в інтерфейсі
Перекладач, чий інтерфейс говорить лише однією мовою, має проблему з довірою, тому інтерфейс 1.0 локалізовано сімома мовами: англійською, китайською, японською, іспанською, французькою, корейською та українською. Ми ставилися до локалізації як до інженерної роботи, а не як до звалища перекладів — підписи на панелях, що обрізалися, кнопки, що вилазили за межі своїх контейнерів, і макети, які пасували лише англійській, — усе це пройшло аудит і було виправлене. Цей блог публікується тими ж сімома мовами, і це здалося нам чесним способом зробити це.
Що означає 1.0
Для нас 1.0 — це базова обіцянка: повний цикл — говори, бач, слухай, зберігай — працює від початку до кінця на кожному рушії, який ми постачаємо, і на тому залізі, на якому, за нашими словами, він працює. SyncTrans 1.0.0 потребує macOS 14 або новішої версії на Apple Silicon, і ви можете завантажити його тут. Огляд можливостей — на сторінці Можливості.
Питання чи звіти про помилки? Дошка відгуків — найшвидший спосіб з нами зв'язатися.