GUÍA

Un servicio TTS propio para Pipecat: da cualquier voz a tu bot

Pipecat es un framework de Python de código abierto para bots de voz y multimodales: una pipeline de procesadores de tramas lleva el audio de quien llama por el reconocimiento de voz, el modelo de lenguaje y el texto a voz, y de vuelta. Incluye servicios para muchos proveedores de voz, y uno nuevo solo necesita una pequeña clase.

Esta guía escribe esa clase para la API de voz de SuperClonica, para que tu bot hable con cualquiera de las 190 voces del catálogo, personajes, narradores y locutores incluidos, o con una voz que entrenes con tu propia grabación.

Cómo funciona un servicio TTS de Pipecat

Un servicio TTS hereda de TTSService e implementa run_tts, un generador asíncrono que recibe un trozo de texto y devuelve tramas de audio PCM de 16 bits. Lo comprobamos con Pipecat 1.14: por defecto el servicio agrupa el texto del modelo en frases, así que run_tts se llama una vez por frase y la primera suena mientras el modelo sigue escribiendo. La clase base también tiene una función auxiliar que quita la cabecera WAV y remuestrea a la frecuencia de la pipeline.

pip install pipecat-ai aiohttp

El servicio

Guárdalo como superclonica_pipecat.py junto a tu bot:

import os
import aiohttp
from pipecat.frames.frames import ErrorFrame
from pipecat.services.settings import TTSSettings
from pipecat.services.tts_service import TTSService

URL = "https://superclonica.com/api/v1/speech"


class SuperClonicaTTSService(TTSService):
    def __init__(self, *, session: aiohttp.ClientSession, voice: str, language: str = "en", **kwargs):
        super().__init__(
            push_start_frame=True,
            push_stop_frames=True,
            settings=TTSSettings(model=None, voice=voice, language=language),
            **kwargs,
        )
        self._session = session
        self._voice, self._language = voice, language

    def can_generate_metrics(self):
        return True

    async def run_tts(self, text: str, context_id: str):
        headers = {"Authorization": "Bearer " + os.environ["SUPERCLONICA_KEY"]}
        body = {"text": text, "voice": self._voice, "language": self._language, "format": "wav"}
        async with self._session.post(URL, json=body, headers=headers) as answer:
            if answer.status != 200:
                yield ErrorFrame(error=f"SuperClonica: {answer.status} {await answer.text()}")
                return
            await self.start_tts_usage_metrics(text)
            async for frame in self._stream_audio_frames_from_iterator(
                answer.content.iter_chunked(self.chunk_size), strip_wav_header=True, context_id=context_id
            ):
                await self.stop_ttfb_metrics()
                yield frame

El servicio pide a la API un WAV, PCM mono de 16 bits a 44,1 kHz tras una cabecera estándar de 44 bytes, y pasa los bytes a la función auxiliar. Esta quita la cabecera, remuestrea a la frecuencia de salida de tu pipeline, como 16 o 24 kHz, y devuelve las tramas. Si la API responde con un error, por ejemplo 429 cuando se agota la ventana del plan, el servicio devuelve un ErrorFrame con el estado y el mensaje.

Úsalo en tu bot

Crea el servicio con una sesión de aiohttp y el ID de la página de la voz elegida, y ponlo en tu Pipeline en lugar del servicio TTS que usas ahora:

import os
import aiohttp
from superclonica_pipecat import SuperClonicaTTSService

session = aiohttp.ClientSession()
tts = SuperClonicaTTSService(session=session, voice=os.environ["VOICE_ID"], language="en")
# put tts in your Pipeline where your current TTS service is

Define SUPERCLONICA_KEY con una clave de la página de la API de voz. El transporte, el reconocimiento de voz y el modelo de lenguaje de tu bot no cambian.

Latencia y planes

Para una frase corta, el WAV llega entero en cuanto se genera; los textos de más de medio minuto de voz la API los transmite en streaming. Según nuestras mediciones, la voz empieza desde unos 300 ms más el tiempo de red. Un plan da segundos de voz en cada ventana de 10 minutos para todas las llamadas juntas: la clave gratuita, un minuto al día para desarrollar; Inicio, 5 $ al mes, hasta 3 minutos por ventana; Pro, 20 minutos. Supertonic 3 habla 31 idiomas, pero aún no chino, y la API no devuelve marcas de tiempo por palabra.