Texto a voz en Pygame con voces naturales
Pygame es donde mucha gente escribe su primer juego, y tarde o temprano un personaje necesita hablar. pyttsx3 habla con las voces robóticas del sistema, y las APIs en la nube necesitan una clave y conexión, algo que el ordenador de clase o el portátil de una game jam quizá no tengan.
El motor SuperClonica es un paquete de Python, así que un proyecto de Pygame puede generar la voz él mismo, sin conexión, con voces naturales en 31 idiomas, y reproducirla con pygame.mixer sin tocar un archivo. Esta guía muestra el código, cómo mantener el juego fluido mientras se genera una frase y cuándo conviene distribuir archivos.
Dos formas de hacer hablar un juego de Pygame
Usa la voz en tiempo real para prototipos, herramientas y juegos que se ejecutan desde el código; para un juego terminado, distribuye archivos.
- Durante la partida: el juego genera cualquier texto, como el nombre del jugador, y lo reproduce al instante.
- Archivos generados antes: frases hechas durante el desarrollo, cargadas con pygame.mixer.Sound como cualquier efecto.
- Las dos formas usan el mismo motor, voces e idiomas; el chino aún no está disponible.
- Todo funciona en un procesador normal, sin tarjeta gráfica.
Elige voces gratis en línea
En la página de cualquier voz, escribe una frase de tu personaje, de 30 a 100 caracteres, elige el idioma y pulsa el botón para generarla. En unos segundos oyes si la voz encaja, sin cuenta.
Genera una frase durante la partida
Cargar el motor lleva unos segundos, así que créalo una vez al arrancar, no para cada frase.
- Instala los dos paquetes: python -m pip install superclonica-cpu pygame.
- Ajusta el mezclador al formato del motor antes de pygame.init(): pygame.mixer.init(frequency=44100, size=-16, channels=1).
- Crea el motor una vez, tts = Superclonica(), y luego genera y reproduce una frase: audio, rate = tts.synthesize("¡Bienvenido, héroe! La aldea te necesita.", "M2", "es"); sound = pygame.mixer.Sound(array=(audio * 32767).astype(np.int16)); sound.play().
- El motor devuelve muestras en coma flotante a 44,1 kHz; pasarlas a enteros de 16 bits es todo lo que pygame necesita.
Que el juego siga fluido
Una frase corta tarda medio segundo en un procesador de escritorio, y un fotograma congelado se nota. Genera las frases en un hilo en segundo plano y deja el Sound terminado en una cola que reproduce el bucle principal, o genera las frases de un nivel mientras se muestra su pantalla de carga. Guarda un diccionario de texto a Sound para que una frase repetida se genere una sola vez.
Si publicas el juego
La voz en tiempo real necesita el motor, unos 385 MB de modelo y Python en el ordenador del jugador, lo que vale para un juego de game jam ejecutado desde el código pero pesa en una descarga. Para un juego publicado, genera todas las frases de antemano con tts.save('line.ogg', audio) y distribuye los archivos OGG. Usa las diez voces de serie del modelo, de M1 a M5 y de F1 a F5, o tu propia voz entrenada con un locutor que dio su consentimiento; las voces de personajes hechas por fans son para juegos de fans y parodias.