Голос у віджеті: мікрофон, мовлення й браузери
Для розробників, у коді: що потрібно браузеру, режим розмови проти диктування, позначка мови мовлення, перебивання на десктопі й напівдуплекс на телефоні, автовідтворення на iOS і що може налаштувати сторінка.
У віджета один голосовий рівень, і обидві його половини працюють на сервері: голосова
відповідь синтезується через POST /tts по одному реченню і відтворюється одним спільним
елементом <audio>; розпізнавання — власний запис мікрофона віджетом, що передається на
WS /ws/stt. Мовленнєвий API браузера не задіяний, і запасного варіанта на нього немає —
voiceProvider не є ключем конфігурації.
У панелі: Віджет → Голос — Голосова розмова, Голосовий ввід (диктування), Швидкість мовлення і голос для кожної мови (налаштування віджета).
Що потрібно браузеру
| Для | Потрібно | Без цього |
|---|---|---|
| голосових відповідей | fetch і Audio |
лише текстові відповіді |
| мікрофона | getUserMedia, AudioContext, WebSocket, захищений origin |
мікрофона немає взагалі; текстовий чат не страждає |
Ніщо не грає звук і не вмикає мікрофон, доки відвідувач чогось не натисне: натискання мікрофона — той жест браузера, що просить пристрій і розблоковує аудіо.
Два незалежні перемикачі
| Перемикач | Що дає відвідувачу |
|---|---|
conversationModeEnabled |
мікрофон персонажа в доку: одне натискання, далі людина говорить, а помічник відповідає вголос і слухає далі — голосова розмова |
voiceInputEnabled |
мікрофон у полі вводу: надиктувати питання в текстове поле; відповідь приходить текстом |
Один, обидва або жоден. Голосова відповідь існує лише в голосовій розмові; питання, набране під час неї, отримує текстову відповідь, а розмова лишається живою. Фіча: голос каже, як це відчувається; ця сторінка — що це таке.
Як іде розмова
- Слухання передає аудіо на
/ws/stt; остаточна розшифровка стає повідомленням і надсилається автоматично. Слова-паразити («гм», «е-е») відкидаються на клієнті; остаточна розшифровка, чия впевненість у словах нижча за поріг сервера, обнуляється, тож шум ніколи не стає питанням. - Мовлення ставить усю відповідь у чергу на
done, розбиту на речення, і готує одне речення наперед, щоб не було пауз; речення може зазвучати раніше, коли сервер позначає потікspeakable. - На пристрої з вказівником відвідувач може перебити голосом: ехоподавлення тримає мікрофон живим під час відповіді, перші слова нової репліки обривають озвучення, а власний голос помічника відфільтровується як ехо.
- На сенсорному пристрої розмова напівдуплексна: динамік спрацьовував би на мікрофон, тож мікрофон закритий, поки звучить кліп. Перебиває кнопка ■ (малюється, поки звучить відповідь), дотик до кнопки запуску, набір тексту або натискання мікрофона (воно ще й ставить на паузу).
- Пауза й відновлення — через натискання мікрофона; фокус на будь-якому текстовому полі автоматично вимикає мікрофон. Після 30 с тиші розмова закінчується.
- iOS дозволяє аудіо на документ і лише після дотику: запам’ятована розмова повертається в спокої, і перший дотик до кнопки запуску відновлює її наживо. Так і має бути.
Позначка мови мовлення
Відвідувач не обирає мову — він говорить. Віджет здогадується з мов браузера і регіону часового
поясу, передає цю мову, а після двох узгоджених розшифровок закріплює її. Позначка біля мікрофона
показує, яку мову слухають, і відкриває список із пошуком усіх мов, які підтримує розпізнавач
(його віддає GET /stt/languages з рідними назвами); вибір зберігається для цього відвідувача.
Мова відповіді йде за питанням, а не за позначкою.
Розмітка і події
::part(companion-mic), ::part(companion-stop), ::part(companion-dictation),
::part(language-chip) перестилізовують елементи. Події: shukai:conversation:enter / :exit,
shukai:voice:listening:start / :stop, shukai:voice:transcript, shukai:voice:speaking:start
/ :end, shukai:voice:error (Події). Shukai.speak(text),
stopSpeaking(), startListening(), stopListening() (JavaScript API).
Що може задати сторінка
conversationModeEnabled і voiceInputEnabled можна перевизначити в ShukaiConfig, але сервер
відхиляє /tts, якщо режим розмови вимкнений у рядку віджета, і відхиляє /ws/stt, якщо вимкнені
обидва перемикачі, — сторінка не може купити голос, якого власник не увімкнув. voiceInputPace і
voiceInputAutosend віддаються фіксованими; перевизначення на сторінці змінює лише власне вікно
тиші віджета і ніколи — затримку кінця репліки на сервері.
Скільки це коштує
Голосова відповідь коштує кредити моделі плюс голосову надбавку — один кредит, три за преміальний голос — додано, а не помножено. Панель власника каже, який голос преміальний. Кредити й моделі.