fix(voice): audio unlock на тапе → TTS играет на Android
All checks were successful
Deploy / deploy (push) Successful in 2m1s
All checks were successful
Deploy / deploy (push) Successful in 2m1s
Android Chrome требует user-gesture для <audio>.play(). Wake-word триггерит TTS «сам», без тапа, поэтому play() тихо отвергался. При тапе на кнопку микрофона теперь проигрываем 1мс silent WAV → браузер помечает страницу как разрешённую для autoplay в текущей сессии. Дальше TTS-ответы Cosmo/Lusya играют без проблем. В VoiceOverlay логируем причину если play() всё ещё отвергнут.
This commit is contained in:
@@ -178,6 +178,21 @@ export default function VoiceController() {
|
|||||||
if (state !== 'idle' && state !== 'error') return
|
if (state !== 'idle' && state !== 'error') return
|
||||||
setState('loading')
|
setState('loading')
|
||||||
|
|
||||||
|
// 0. «Audio unlock» — Android Chrome не даёт <audio>.play() без user-gesture.
|
||||||
|
// Wake-word срабатывает сам, поэтому позже play() будет тихо отвергнут.
|
||||||
|
// Проигрываем 1мс silent WAV прямо сейчас (user тапнул кнопку → есть gesture).
|
||||||
|
try {
|
||||||
|
const silent = new Audio(
|
||||||
|
'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA',
|
||||||
|
)
|
||||||
|
silent.volume = 0
|
||||||
|
await silent.play()
|
||||||
|
silent.pause()
|
||||||
|
console.log('[voice] audio unlock ok')
|
||||||
|
} catch (e: any) {
|
||||||
|
console.warn('[voice] audio unlock failed:', e?.message)
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Запрос разрешения на микрофон отдельно
|
// 1. Запрос разрешения на микрофон отдельно
|
||||||
try {
|
try {
|
||||||
const probe = await navigator.mediaDevices.getUserMedia({ audio: true })
|
const probe = await navigator.mediaDevices.getUserMedia({ audio: true })
|
||||||
|
|||||||
@@ -93,7 +93,8 @@ export default function VoiceOverlay() {
|
|||||||
audioRef.current = audio
|
audioRef.current = audio
|
||||||
try {
|
try {
|
||||||
await audio.play()
|
await audio.play()
|
||||||
} catch {
|
} catch (e: any) {
|
||||||
|
console.warn('[voice] audio.play() rejected:', e?.name || e?.message || e)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
Reference in New Issue
Block a user