Estoy usando @google-cloud/text-to-speech para transmitir audio.
Aquí está el código en el backend:
import { TextToSpeechClient } from '@google-cloud/text-to-speech'; const t2s = new TextToSpeechClient(); app.use('/api/v1/text2speech', async (req, res) => { const text = req.query['text']; const t2s = new TextToSpeechClient(); const request = { input: { text }, audioConfig: { audioEncoding: 2 } }; const [response] = await t2s.synthesizeSpeech(request); res.setHeader('Content-Type', 'audio/mpeg'); res.write(response.audioContent); return res.end(); });En el navegador:
<audio src="/api/v1/text2speech?text=Audio to be played"></audio>Intente hacer algo en el evento de finalización de audio:
const audio = document.querySelector('audio'); audio.addEventListener('ended', () => { // Nothing happens here on iOS/iPad OS window.alert('Audio has ended'); });Resultado: Funciona en todos los dispositivos excepto iOS/iPad OS
Notas:
ended incluso se activa cuando el audio se reproduce desde un archivo estático. Pero necesito transmitir el audio y no reproducirlo desde un archivo.audio.paused pero la propiedad audio.paused sigue siendo falsa para siempre, aunque la transmisión se haya completado.currentTime .