Lección 19 · 5 min · Gratis
Construye un cambiador de voz con ElevenLabs (Next.js)
Antes de escribir cualquier código, invoca la habilidad /text-to-speech para aprender los patrones correctos del SDK de ElevenLabs.
1. app/api/voice-changer/route.ts
Endpoint POST seguro que acepta audio grabado en el navegador a través de FormData, lo convierte usando speech-to-speech y devuelve el audio transformado.
- Lee
ELEVENLABS_API_KEYdeprocess.env. Devuelve 500 si falta. - Acepta
audio(File),voiceId(string) y el opcionalmodelId(string, por defectoeleven_multilingual_sts_v2) del FormData de la solicitud. - Devuelve 400 si falta
audioovoiceId. - Llama a
elevenlabs.speechToSpeech.convert(voiceId, { audio, modelId, outputFormat: "mp3_44100_128" }). - Recopila el stream devuelto en un Buffer y responde con el tipo de contenido
audio/mpeg. - Envuelve en try/catch y devuelve un error JSON en caso de fallo.
2. app/api/voices/route.ts
Endpoint GET seguro que devuelve la lista de voces disponibles.
- Llama a
elevenlabs.voices.getAll(). - Devuelve
voicescomo un array JSON con los camposvoiceId,nameypreviewUrl.
3. app/page.tsx
Página de cambio de voz con grabación en el navegador, selección de voz, conversión y reproducción de audio.
- Obtén las voces de
/api/voicesal montar y rellena un selector desplegable. - Voz predeterminada:
JBFqnCBsd6RMkjVDRZzb(George). - Cuatro estados de UI: inactivo, grabando, listo para convertir y convirtiendo.
- Grabación: usa
navigator.mediaDevices.getUserMedia({ audio: true })yMediaRecorder(prefiere el tipo mimeaudio/webm). - Muestra un botón prominente de "Grabar". Mientras grabas, muestra el tiempo transcurrido y un indicador rojo pulsante. Muestra un botón de "Detener" para finalizar la grabación.
- Después de detener, crea una URL de objeto para la grabación original y renderiza un reproductor
<audio>para que el usuario pueda previsualizarlo antes de convertir. - Mantén el selector de voz visible, pero deshabilitado hasta que haya una grabación disponible. Habilítalo después de que la grabación se detenga.
- El botón "Convertir Voz" debe permanecer deshabilitado hasta que tanto una grabación como una selección de voz estén disponibles.
- Al enviar, haz un POST de FormData con el audio grabado como
audio, másvoiceIdymodelId, a/api/voice-changer. Dale a la grabación un nombre de archivo comorecording.webm. - Muestra un spinner de carga durante la conversión.
- En caso de éxito, crea una URL de objeto a partir del blob de respuesta y renderiza un segundo reproductor
<audio>etiquetado como "Audio Convertido" con controles. - Si el usuario cambia la voz seleccionada después de una conversión, trata el resultado convertido como obsoleto y permítele hacer clic en "Convertir Voz" nuevamente para generar una versión nueva de la misma grabación.
- Muestra un enlace de "Descargar" para el archivo convertido.
- Muestra un botón de "Grabar de Nuevo" para borrar ambos reproductores de audio y empezar de nuevo.
- Muestra los errores en línea. Maneja la denegación de permisos de micrófono con elegancia. Limpia las pistas de medios y revoca las URL de objeto cuando se reemplacen o al desmontar.
Lección del curso «ElevenLabs Examples» de ElevenLabs, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a ElevenLabs. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios