Cómo enseñar a leer a Piper TTS: normalización de texto y tiempos por palabra
Resumen
Piper es un motor neuronal de síntesis de voz rápido que funciona en procesadores comunes, pero lee el texto exactamente como está escrito. Los precios, las fechas, los teléfonos, las abreviaturas y las unidades suelen leerse de forma literal: «5,50 €» se convierte en «cinco coma cincuenta euro» y «Sr. García» termina la frase después de «señor». Creamos una capa de preparación de texto para Piper que reescribe estas formas y recuerda, para cada palabra pronunciada, la palabra escrita de la que procede. También fija las pausas entre frases, líneas y párrafos, corrige la pronunciación británica de algunas voces de inglés estadounidense y obtiene tiempos exactos por palabra para subtítulos a partir de las duraciones de fonemas del propio Piper. En 84 frases de prueba en inglés y español escritas por nosotros, la tasa de error de fonemas bajó del 32,6% al 0,9%, y ninguna de las 19 frases de control cambió. En la mitad reservada de los casos de prueba públicos de NVIDIA NeMo, que no escribimos nosotros, la tasa de error de fonemas en inglés fue del 41,0% para el texto sin procesar, del 28,5% para un script típico de números a palabras y del 15,8% con nuestra capa; en español fue del 64,7%, el 56,2% y el 43,2%. El código, las frases de prueba y los resultados están disponibles con la licencia Apache 2.0.
Lo que Piper lee si el texto no se prepara
Piper convierte el texto en fonemas con espeak-ng y después sintetiza cada frase con un pequeño modelo VITS. No normaliza el texto por sí mismo. espeak-ng lee bien las palabras sencillas, los números corrientes, los ordinales, las horas como «3:30» y las direcciones de correo, pero muchas formas escritas cotidianas se leen símbolo a símbolo, y algunas abreviaturas terminan la frase en mitad de un nombre.
Pasamos frases cotidianas por la misma versión de espeak-ng que usa Piper 1.8 y anotamos lo que se oye. La tabla lo compara con lo que nuestra capa entrega a la voz. La última columna la genera el código actual cada vez que se construye esta página.
| Escrito | Voz | Se oye sin preparación | Lo que recibe la voz con preparación |
|---|---|---|---|
| Dr. Smith lives on Elm St. | inglés (EE. UU.) | “Doctor.” (la frase termina) “Smith lives on Elm Saint.” | Doctor Smith lives on Elm Street. |
| It costs $5.50. | inglés (EE. UU.) | “It costs dollar five point five zero.” | It costs 5 dollars and 50 cents. |
| Due on 4/5/2026. | inglés (EE. UU.) | “Due on four slash five slash two thousand twenty-six.” | Due on April 5th, 20 26. |
| In the 1990s. | inglés (EE. UU.) | “In the nineteen hundred ninety Z.” | In the 19 nineties. |
| At 60 km/h, open 24/7. | inglés (EE. UU.) | “At sixty K M slash H, open twenty-four slash seven.” | At 60 kilometers per hour, open 24 7. |
| Read chapter IV about Henry VIII. | inglés (EE. UU.) | “Read chapter Roman four about Henry Roman eight.” | Read chapter 4 about Henry the 8th. |
| Great job 👍 | inglés (EE. UU.) | “Great job thumbs up” | Great job. |
| Wait... what? | inglés (EE. UU.) | “Wait what?” sin pausa | Wait, what? |
| Call +1 555-123-4567. | inglés (EE. UU.) | “Call plus one five hundred fifty-five dash one hundred twenty-three dash four thousand five hundred sixty-seven.” | Call plus 1, 5 5 5, 1 2 3, 4 5 6 7. |
| El Sr. García llegó. | español (España) | «El señor.» (la frase termina) «García llegó.» | El señor García llegó. |
| Llegamos el 15/10/2026. | español (España) | «Llegamos el quince barra diez barra dos mil veintiséis.» | Llegamos el 15 de octubre de 2026. |
| Vive en la Av. de Mayo. | español (España) | «Vive en la ab de Mayo.» | Vive en la avenida de Mayo. |
| Cuesta 5,50 €. | español (España) | «Cuesta cinco coma cincuenta euro.» | Cuesta 5 euros con 50 céntimos. |
| A las 10 a. m. | español (España) | «A las diez a eme.» | A las 10 de la mañana. |
| Llama al 912 345 678. | español (España) | «Llama al novecientos doce trescientos cuarenta y cinco seiscientos setenta y ocho.» | Llama al 9 1 2, 3 4 5, 6 7 8. |
Escucha: antes y después
Estas grabaciones salen del motor de texto a voz de Loudness.ai: la misma voz y el mismo texto, antes de activar la capa de preparación del texto y después, el 15 de octubre de 2026. Cada toma se genera de nuevo, así que es normal que la entonación varíe un poco; fíjate en lo que se lee. Los ejemplos están en inglés.
Daniel · inglés (EE. UU.)
Texto escrito
Dr. Smith's new schedule starts on 4/5/2026 at 9:05 a.m. The ticket costs $5.50, or $12.99 with the fast lane. Wait... is that right?
- «Dr.» ya no corta la frase
- La fecha se lee «April 5th, 2026» y la hora «nine oh five»
- «$5.50» se lee «five dollars and fifty cents»
- Una pausa real después de «Wait…»
- «schedule» y «new» con pronunciación estadounidense
Antes: el texto tal cual
Después: con preparación del texto
Olivia · inglés (EE. UU.)
Texto escrito
In the 1990s, the train ran at 60 km/h. Henry VIII appears in chapter IV. Call +1 555-123-4567 or email hello@loudness.ai.
- «Nineteen nineties», no «nineteen hundred and ninety z»
- «Kilometers per hour»
- «Henry the Eighth» y «chapter four», sin «Roman»
- El teléfono, por grupos de dígitos
Antes: el texto tal cual
Después: con preparación del texto
Jenny · inglés (Irlanda)
Texto escrito
Shopping list
- Tomatoes
- 1/2 cup of yogurt
- Fresh herbs
That's everything for today 👍
- Cada línea de la lista termina como una frase
- «One half cup» en lugar de «one slash two»
- Una pausa más larga antes del último párrafo
- El emoji ya no se lee como «thumbs up»
Antes: el texto tal cual
Después: con preparación del texto
Hannah · inglés (EE. UU.)
Texto escrito
this transcript was pasted without any punctuation so the voice used to read every word in one long breath which made it hard to follow and tiring to listen to because there was never a moment to pause and the ideas all ran together
- Pausas breves de coma en un texto largo sin puntuación
Antes: el texto tal cual
Después: con preparación del texto
Kristin · inglés (EE. UU.)
Texto escrito
Mr. and Mrs. Jones met J. K. Rowling at St. Mary's on Elm St. They paid 1,250,000 dollars. Really?!
- «Mr.», «Mrs.» y «J. K. Rowling» ya no cortan la frase
- «Elm St.» se lee «Elm Street» y sigue cerrando la frase
Antes: el texto tal cual
Después: con preparación del texto
Jordan · inglés (EE. UU.)
Texto escrito
Either way, the garage privacy policy is necessary for the new library laboratory. Students can check the schedule every Tuesday.
- Pronunciación estadounidense de «either», «garage», «privacy», «necessary», «library» y «laboratory»
- Y también de «new», «students», «schedule» y «Tuesday»
Antes: el texto tal cual
Después: con preparación del texto
Reglas que recuerdan el texto original
Cada línea de texto pasa por una lista ordenada de reglas. Una regla es una expresión regular y una función que indica qué leer en su lugar, o la rechaza. Las reglas siempre buscan en el texto original, nunca en el resultado de otras reglas, y la primera regla que reclama un fragmento de caracteres gana. Después, la línea se reconstruye con el texto intacto y los reemplazos, y cada carácter del resultado lleva el fragmento del original del que procede.
Esto tiene dos efectos prácticos. Las reglas no pueden estropearse entre sí: una dirección web reclamada por la regla de direcciones nunca la tocan las reglas de abreviaturas o de barras. Y cada palabra pronunciada conoce su origen: «euros» en «5 euros con 50 céntimos» apunta a «5,50 €», de modo que los subtítulos pueden mostrar lo que escribió la persona mientras los tiempos siguen lo que dijo la voz. Una regla que conserva su primera palabra, como «Felipe VI» leído «Felipe sexto», reclama solo el resto, así que cada palabra escrita conserva sus propias palabras habladas. Los dobles corchetes escritos en el texto se neutralizan para que nadie pueda inyectar fonemas en bruto.

Qué cubren las reglas
El inglés y el español tienen conjuntos de reglas completos; los otros 25 idiomas de nuestro despliegue reciben las reglas de formato y de pausas.
Tratamientos y abreviaturas de calles como «Dr.», «Sr.», «Sra.», «Av.» o «c/» se expanden sin crear un final de frase falso, y se mantiene el final real cuando la abreviatura cierra la frase. El dinero se lee con singular y plural y con monedas regionales: «$» se lee como pesos en el español de México. Las fechas se leen en formato numérico, ISO, con puntos o escritas, en el orden de cada región. Las horas incluyen segundos, el formato de 24 horas y «a. m.» y «p. m.».
Décadas, unidades, intervalos y fracciones cubren formas como «60 km/h», «páginas 10–20» y «3/4 de taza». Los teléfonos se leen por grupos de dígitos, incluido el formato de nueve dígitos de España. Los números romanos se leen tras palabras clave y nombres de monarcas, como «Felipe VI» o «Luis XIV». También se tratan las iniciales, los millares agrupados con espacios y las barras entre palabras.
Formato, en todos los idiomas: se eliminan los marcadores de lista, el marcado markdown y los emojis, las direcciones web pierden «https://» y «www», y una línea sin puntuación final recibe un punto para terminar con entonación descendente.
Frases, líneas, párrafos y pausas
El texto preparado se divide en segmentos, y cada segmento va seguido de una pausa de un tipo conocido: frase, línea de lista, párrafo, puntos suspensivos o cláusula. Una frase solo termina en un punto, un signo de interrogación o de exclamación que no vaya seguido de minúscula, y solo después de expandir las abreviaturas. Con p como la pausa elegida por el usuario, el silencio es p tras una frase, una línea o unos puntos suspensivos, 0,4 p tras una cláusula y el mayor de 2 p y p + 0,3 segundos tras un párrafo.
Los tramos largos sin puntuación cuestan de seguir. Un tramo de más de 28 palabras se divide antes de una conjunción cercana a su mitad, si existe (siete idiomas tienen listas de conjunciones), o si no en un espacio entre palabras, y la primera parte termina en coma para que la voz mantenga un tono de continuación.
Cada segmento se sintetiza por separado y se une con silencios exactos. Las voces suelen terminar en una muestra distinta de cero, entre 28 y 57 dB por debajo del pico en nuestras mediciones, lo que puede producir un chasquido frente al silencio digital. Un fundido de entrada de 3 ms y uno de salida de 12 ms en cada unión eliminan el chasquido.
Voces estadounidenses entrenadas con fonemas británicos
Cada voz de Piper se entrena con los fonemas de una voz de espeak-ng, que queda registrada en la configuración del modelo. Varias voces comunitarias de inglés (EE. UU.), entrenadas con locutores estadounidenses de audiolibros, registran la voz «en» de espeak, que es inglés británico. Para la mayoría de las palabras esto no perjudica: el modelo aprendió a convertir los símbolos británicos en los sonidos estadounidenses de sus locutores.
Importa cuando la forma británica es otra pronunciación y no solo otro acento. espeak «en» da «shed-yool» para schedule, «tom-ah-toe» para tomato, privacy con i breve y «zed» para la letra Z, y las voces dicen exactamente eso.
Cambiar estas voces a fonemas estadounidenses no funciona, porque sus datos de entrenamiento nunca contuvieron símbolos como la vocal con color de r o la t batida. En su lugar escribimos formas estadounidenses de 118 palabras frecuentes, entre ellas palabras terminadas en -ary y -ory, palabras como «new» y «student» y la letra Z, usando solo símbolos del conjunto británico. Se pasan a Piper como bloques de fonemas en bruto, y solo a las voces estadounidenses cuyo modelo registra «en». Una prueba unitaria comprueba que ningún bloque usa un símbolo ajeno a ese conjunto.
Aquí importan dos detalles de Piper. La puntuación situada justo después de un bloque de fonemas en bruto se descarta y la palabra siguiente se une al bloque, así que la puntuación debe ir dentro del bloque. Y un bloque en bruto seguido de texto deja un espacio doble, que eliminamos antes de sintetizar.
Tiempos por palabra a partir de las duraciones del modelo
Los subtítulos y el resaltado por palabra necesitan saber cuándo se pronuncia cada palabra. Lo habitual es alinear el audio después de sintetizarlo, con un alineador forzado o un reconocedor de voz. Los modelos VITS de Piper ya predicen cuánto dura cada fonema, y Piper 1.8 puede exponer esas duraciones como salida adicional del modelo. Las usamos directamente.
Para cada segmento obtenemos el inicio y el final de cada símbolo fonético, incluidos los de puntuación, cuyas duraciones contienen las pausas. Cada palabra preparada se fonetiza por separado para estimar cuántos símbolos tiene, y una pequeña programación dinámica elige dónde empiezan los símbolos de cada palabra: cerca de su parte esperada, prefiriendo los espacios entre palabras habladas y dando a cada palabra al menos un símbolo. Así se resuelve que espeak-ng fusione palabras cortas («for the» se convirtió en una sola palabra en nuestras pruebas) o expanda una palabra escrita en varias («2026»).
Después, las palabras habladas se asignan a las escritas mediante los fragmentos descritos arriba. Cuando varias palabras habladas cubren varias escritas, como «5 euros con 50 céntimos» para «5,50 €», se reparten el tiempo en proporción a la longitud de las palabras escritas. Los subtítulos siguen los segmentos: uno por frase o línea, los más largos divididos en espacios entre palabras para caber en dos líneas de unos 42 caracteres, y un subtítulo que se corta a mitad de una idea se une al siguiente cuando ambos caben.
Una nota de memoria para desarrolladores. Exponer las duraciones exige editar el grafo del modelo. El cargador de Piper puede hacerlo en memoria, pero en nuestro despliegue eso usó 811 MB para cuatro voces, frente a 480 MB al cargar las mismas voces desde archivos. Escribir una vez en disco cada modelo editado y cargar ese archivo devolvió el uso de memoria a 486 MB.
Resultados con nuestro conjunto de pruebas
Medimos la tasa de error de fonemas (PER). Cada salida y una lectura de referencia se fonetizan con la misma voz de espeak-ng; tras quitar las marcas de acento, la puntuación y los espacios entre palabras, la PER es la distancia de edición entre las dos cadenas de símbolos dividida por la longitud de la referencia. Un caso es exacto cuando la PER es cero. Como ambos lados los lee espeak-ng, la métrica separa la preparación del texto de la lectura que hace espeak-ng de las palabras corrientes. También contamos los finales de frase falsos.
Nuestro conjunto tiene 103 frases: 84 casos de prueba en 13 categorías con referencias escritas a mano y 19 frases de control de texto sencillo cuya referencia es el propio texto, de modo que cualquier cambio en un control cuenta como perjuicio. Incluimos a propósito dos fallos conocidos: un heterónimo y una unidad ambigua.
La capa eliminó casi todas las diferencias con las referencias en las categorías a las que se dirige, eliminó los 18 finales de frase falsos y no cambió ninguno de los 19 controles. Las cuatro diferencias restantes son los dos fallos deliberados, una fracción cuyo género en español la regla no puede conocer («media taza») y una variante ortográfica en una referencia. Como escribimos tanto las reglas como este conjunto, estas cifras muestran la cobertura de los casos previstos, no la generalización.
| Grupo | Casos | PER sin | PER con | Exactos sin | Exactos con | Finales falsos sin | Finales falsos con |
|---|---|---|---|---|---|---|---|
| Todos los casos de prueba | 84 | 32,6 | 0,9 | 10 | 80 | 18 | 0 |
| Inglés | 58 | 33,6 | 0,9 | 6 | 55 | 13 | 0 |
| Español | 26 | 30,4 | 0,8 | 4 | 25 | 5 | 0 |
| Controles (texto sin cambios) | 19 | 0,0 | 0,0 | 19 | 19 | 0 | 0 |
| nombre de marca | 1 | 20,8 | 0,0 | 0 | 1 | 0 | 0 |
| fechas | 6 | 41,8 | 0,0 | 0 | 6 | 1 | 0 |
| décadas | 3 | 11,5 | 0,0 | 1 | 3 | 0 | 0 |
| iniciales | 2 | 0,0 | 0,0 | 2 | 2 | 3 | 0 |
| límites conocidos | 2 | 23,4 | 23,4 | 0 | 0 | 0 | 0 |
| formato | 7 | 72,6 | 0,0 | 2 | 7 | 3 | 0 |
| dinero | 9 | 50,5 | 0,0 | 0 | 9 | 0 | 0 |
| teléfonos | 3 | 85,2 | 0,0 | 0 | 3 | 0 | 0 |
| intervalos, fracciones y barras | 9 | 25,5 | 2,4 | 0 | 8 | 0 | 0 |
| números romanos | 5 | 26,7 | 0,0 | 0 | 5 | 0 | 0 |
| horas | 6 | 27,7 | 0,0 | 0 | 6 | 0 | 0 |
| tratamientos | 21 | 15,3 | 0,3 | 5 | 20 | 11 | 0 |
| unidades | 10 | 31,8 | 0,0 | 0 | 10 | 0 | 0 |
Una prueba independiente que no escribimos
Para medir la generalización usamos los casos de prueba de texto escrito a hablado en inglés y español publicados con NVIDIA NeMo text processing (commit ddadfb2, 957 casos utilizables). Los dividimos en dos mitades mediante un hash del texto escrito. Estudiamos fallos individuales solo en la mitad de desarrollo y corregimos allí carencias generales; presentamos la mitad reservada, cuyos casos individuales no inspeccionamos.
Comparamos tres sistemas: el texto bruto tal como lo recibe Piper; un script comunitario típico que escribimos para que fuera capaz y justo, con num2words y tratamiento de moneda, porcentajes, ordinales, años, decimales, fechas numéricas, horas, separadores de millares y abreviaturas comunes; y nuestra capa. El normalizador de NeMo no se evaluó con sus propios casos.
En la mitad reservada nuestra capa tuvo el menor error en ambos idiomas. En la mitad de desarrollo las cifras fueron del 41,9%, el 29,4% y el 19,5% en inglés y del 64,8%, el 55,4% y el 36,9% en español. Después de la evaluación, al comprobar los consejos de escritura de más abajo, vimos que los teléfonos españoles en el formato agrupado de España («912 345 678») y cantidades como «1 500 kg» se unían en un solo número. Corregimos ambas cosas; ninguna cifra publicada cambió.
| Idioma | Casos | Texto bruto | Script num2words | Esta capa | Exactos: bruto | Exactos: script | Exactos: esta capa |
|---|---|---|---|---|---|---|---|
| Inglés | 200 | 41,0 | 28,5 | 15,8 | 65 | 85 | 99 |
| Español | 277 | 64,7 | 56,2 | 43,2 | 47 | 61 | 64 |

De dónde vienen las mejoras
Por categoría, las mayores mejoras se dieron en dinero, teléfonos, horas, fechas y fracciones. Nuestra capa fue peor que el texto bruto en las direcciones web, porque quita «https://» y «www» a propósito y las referencias de NeMo los conservan. El script fue mejor en los cardinales y las horas en español: espeak-ng lee números grandes como mil millones como «uno mil millones», algo que el script evita al escribir los números él mismo, y NeMo lee «01:00» como «una» donde nosotros decimos «una en punto».
Las referencias de NeMo siguen un único estilo de lectura, así que una lectura correcta en otro estilo, como «two thousand twelve» frente a «twenty twelve» de NeMo, cuenta como error para todos los sistemas. Por eso importan más las diferencias entre sistemas que las cifras absolutas.
| Idioma | Categoría | Casos | Texto bruto | Script num2words | Esta capa |
|---|---|---|---|---|---|
| Inglés | dirección | 6 | 51,4 | 43,2 | 46,0 |
| Inglés | cardinal | 12 | 15,4 | 29,3 | 15,2 |
| Inglés | fecha | 23 | 59,0 | 29,0 | 20,5 |
| Inglés | decimal | 6 | 4,4 | 36,7 | 4,4 |
| Inglés | electrónico | 19 | 10,2 | 10,9 | 16,8 |
| Inglés | fracción | 6 | 57,9 | 62,4 | 25,5 |
| Inglés | matemáticas | 2 | 0,0 | 0,0 | 0,0 |
| Inglés | medida | 11 | 41,6 | 41,4 | 34,6 |
| Inglés | dinero | 38 | 77,8 | 26,5 | 13,3 |
| Inglés | ordinal | 10 | 16,7 | 23,1 | 16,7 |
| Inglés | intervalo | 12 | 37,4 | 23,8 | 19,1 |
| Inglés | romano | 1 | 60,0 | 60,0 | 0,0 |
| Inglés | serie | 13 | 9,4 | 11,6 | 10,1 |
| Inglés | teléfono | 7 | 79,9 | 83,2 | 12,0 |
| Inglés | hora | 9 | 103,0 | 80,1 | 19,0 |
| Inglés | lista de términos | 2 | 4,2 | 0,0 | 20,0 |
| Inglés | palabra | 23 | 3,6 | 5,4 | 1,5 |
| Español | cardinal | 37 | 51,2 | 15,5 | 46,8 |
| Español | fecha | 10 | 39,3 | 36,9 | 39,3 |
| Español | decimal | 10 | 25,2 | 28,6 | 16,6 |
| Español | electrónico | 17 | 27,3 | 27,3 | 47,3 |
| Español | fracción | 40 | 66,6 | 64,3 | 47,6 |
| Español | medida | 19 | 49,2 | 55,9 | 39,6 |
| Español | dinero | 33 | 71,2 | 66,5 | 53,7 |
| Español | ordinal | 65 | 98,4 | 96,8 | 42,7 |
| Español | teléfono | 6 | 70,2 | 69,7 | 28,6 |
| Español | hora | 15 | 120,8 | 67,1 | 77,9 |
| Español | lista de términos | 4 | 81,8 | 81,8 | 81,8 |
| Español | palabra | 21 | 0,0 | 0,0 | 0,0 |
Qué reglas importan
Desactivamos un grupo de reglas cada vez en la mitad reservada. El tratamiento del dinero fue lo que más aportó en inglés, y la agrupación de números lo que más aportó en español. Un valor negativo significa que desactivar el grupo reduciría el error en este conjunto: de nuevo las direcciones web, por el motivo anterior. Los grupos dirigidos a formas ausentes de los casos de NeMo, como tratamientos, formato y pausas, no muestran efecto aquí y se miden con nuestro conjunto.
| Grupo de reglas desactivado | Inglés | Español |
|---|---|---|
| dinero | +12,6 | +2,9 |
| agrupación de números | 0,0 | +14,0 |
| horas | +3,8 | +0,6 |
| fracciones | +1,0 | +3,0 |
| fechas | +3,9 | 0,0 |
| unidades | +0,5 | +1,9 |
| teléfonos | +2,4 | −0,2 |
| décadas | +1,2 | 0,0 |
| números romanos | +0,3 | 0,0 |
| abreviaturas | +0,2 | 0,0 |
| intervalos | +0,1 | 0,0 |
| barras | −0,3 | 0,0 |
| direcciones web | −0,5 | −1,2 |
Tiempos y ajustes de voz
En 414 tomas sintetizadas de las frases de prueba en inglés (dos voces, tres ajustes de velocidad y pausa), todas las palabras escritas recibieron un tiempo en 408 tomas; en las otras seis, la palabra sin tiempo es un emoji, que se elimina y no se pronuncia. Los tiempos quedaron ordenados y sin solapamiento en las 414 tomas, y su total coincidió con la duración del audio en las 414. De 684 cortes entre palabras, el 97,2% cayó en un espacio entre palabras habladas; el resto está dentro de palabras que espeak-ng fusionó o expandió, donde no hay espacio.
No comparamos los tiempos con alineaciones anotadas por personas. Las duraciones son las mismas con las que se generó el audio y, en nuestras comprobaciones, las marcas de tiempo del reconocimiento de voz se desviaban hasta unos cientos de milisegundos dentro de una frase, lo que las hacía inadecuadas como referencia.
Por separado, escalamos el noise scale y el noise width de cada voz a 0,7 veces los valores del modelo para reducir el temblor audible. Con un predictor automático de naturalidad (UTMOS) y una comprobación de claridad con reconocimiento de voz sobre tres frases por voz, la puntuación media de 13 voces en inglés subió de 93,2 a 94,8, y la naturalidad predicha de 4,16 a 4,26 sobre 5. Esa diferencia es menor que la reproducibilidad de la puntuación por voz (3,5 puntos); un oyente, el autor, prefirió el ajuste más tranquilo. Hay una prueba de escucha en preparación.
Consejos de escritura para una voz mejor
La preparación de texto resuelve la mayoría de las formas cotidianas, pero algunas formas escritas son ambiguas y ninguna regla puede saber qué quiso decir quien escribe. Estos consejos sirven para cualquier lector basado en Piper, incluida la herramienta de texto a voz de Loudness.ai. Cada uno se comprobó con el código actual.
| Escribe | En lugar de | Por qué |
|---|---|---|
| a las 9:05 | a las 9.05 | Un punto entre números se lee como decimal: «nueve punto cero cinco». Con dos puntos se lee «nueve y cinco». |
| 5,50 € | 5,50 euros | Con el símbolo, el precio se lee «5 euros con 50 céntimos». Con la palabra, «cinco coma cincuenta euros». |
| 15/10/2026 o 15 de octubre de 2026 | 10/15/2026 | Las fechas numéricas se leen con el día primero. En el orden estadounidense la fecha no se reconoce y se leen las barras: «diez barra quince…». |
| 912 345 678 | 912345678 | Los dígitos agrupados se leen por grupos. Seguidos se leen como una cifra: «novecientos doce millones…». |
| 3 m o 3 metros | 3m | Sin espacio, «3m» puede ser metros o millones, así que se lee como letras: «tres eme». |
| por ejemplo | p. ej. | Algunas abreviaturas se leen a medias: «pe ejemplo». Escribe las palabras. |
| 1500 millones | 1 500 000 000 | El fonetizador lee mal las cifras de miles de millones: «uno mil quinientos millones». Escribe la escala con palabras. |
| ¿Seguro?... Sí. | ¿Seguro? Sí. | La puntuación marca las pausas: la coma, una pausa breve; el punto, una pausa de frase; los puntos suspensivos, una más larga; y una línea en blanco, una pausa de párrafo. Las frases muy largas se dividen solas, pero tus comas suenan más naturales. |
| Cada elemento en su línea | Uno - dos - tres | Cada línea se lee como una frase con una pausa después. Los guiones y viñetas de las listas no se leen. |
| loudness.ai/es | https://www.loudness.ai/es/?ref=mail | Las direcciones web se leen sin https:// ni www, pero el resto se lee carácter a carácter. Que sean cortas. |
| ¡Buen trabajo, gracias! | ¡Buen trabajo 👍! | Los emojis se eliminan y no se leen. Usa palabras si el significado importa. |
Consejos para desarrolladores que usan Piper
1. Normaliza antes de fonetizar y conserva un mapa de cada palabra hablada al texto original; los subtítulos y el resaltado dependen de él.
2. Expande tratamientos y abreviaturas sin su punto, o espeak-ng terminará la frase ahí.
3. Comprueba con qué voz de espeak-ng se entrenó un modelo antes de fiarte de su acento.
4. Pon la puntuación dentro de los bloques de fonemas en bruto.
5. Aplica un fundido en cada unión entre voz y silencio.
6. Toma los tiempos por palabra de las duraciones del propio modelo y carga el modelo editado desde un archivo, no en memoria.
7. Prueba también frases de control sencillas. Una regla que cambia el texto corriente es una regresión.
Todo lo de esta lista está incluido en loudness-tts, nuestro SDK de texto a voz gratuito y de código abierto para Python y JavaScript (GitHub, PyPI). La guía de instalación se sigue en unos cinco minutos.
Limitaciones
Nuestro conjunto lo escribió el autor de las reglas. Los casos de NeMo son independientes, pero siguen un único estilo de lectura, y espeak-ng lee todas las referencias, así que las que lee mal añaden error a todos los sistemas. Cada caso tiene una sola referencia. Solo el inglés y el español tienen reglas completas; los demás idiomas reciben las reglas de formato y de pausas. Persisten los heterónimos como «read» y las formas ambiguas como «3m». Los números españoles grandes están limitados por espeak-ng.
La lista de palabras estadounidenses es una selección, y su beneficio se comprobó a nivel de fonemas, no con oyentes. La síntesis es estocástica, y los resultados de tiempos y de ajustes de voz proceden de tomas únicas. La preparación de texto corrige lo que dice una voz, no cómo suena: el temblor y la ondulación de los modelos VITS pequeños siguen siendo una propiedad del modelo de voz.
Reproducir el estudio
El paquete del estudio contiene la capa de preparación de texto, ttsprep (Python 3.9 o posterior, sin dependencias), con sus 30 pruebas unitarias, un adaptador opcional que obtiene tiempos por palabra con un Piper instalado, los scripts de evaluación, nuestras 103 frases de prueba con referencias, los casos de NeMo con su origen, licencia y sumas de verificación, todos los archivos de resultados y el código LaTeX del artículo en inglés y en español. El código, las frases de prueba y los resultados se publican con la licencia Apache 2.0.
Para reproducir las tablas, instala piper-tts 1.8.0 y num2words 0.5.14, indica en ESPEAK_DATA_PATH los datos de espeak-ng incluidos en Piper si no se encuentran y ejecuta los dos scripts de evaluación con una carpeta de salida. Su resultado coincide exactamente con los archivos publicados.
No se incluyen Piper ni espeak-ng (GPL-3.0), los modelos de voz ni el código de NeMo. Las mediciones de texto usaron piper-tts 1.8.0 con su espeak-ng 1.52.0.1, onnxruntime 1.19.2, NumPy 2.0.2 y Python 3.9.6 en un portátil Apple M4; las comprobaciones de producción usaron onnxruntime 1.31.0, NumPy 2.5.4 y Python 3.12.3 en un servidor virtual AMD EPYC de 12 vCPU.
Conflictos de intereses y financiación
El autor desarrolla Loudness.ai, cuya herramienta de texto a voz usa el método descrito aquí. No se recibió financiación externa.
Referencias
Hansen, M. y la Open Home Foundation. Piper: a fast, local neural text to speech system. Colaboradores de eSpeak NG. eSpeak NG.
Kim, J., Kong, J. y Son, J. (2021). Conditional variational autoencoder with adversarial learning for end-to-end text-to-speech. ICML 2021.
Sproat, R., Black, A. W., Chen, S., Kumar, S., Ostendorf, M. y Richards, C. (2001). Normalization of non-standard words. Computer Speech & Language, 15(3), 287–333. Ebden, P. y Sproat, R. (2015). The Kestrel TTS text normalization system. Natural Language Engineering, 21(3), 333–353.
Sproat, R. y Jaitly, N. (2016). RNN approaches to text normalization: a challenge. Zhang, H. et al. (2019). Neural models of text normalization for speech applications. Computational Linguistics, 45(2), 293–337.
Zhang, Y., Bakhturina, E., Gorman, K. y Ginsburg, B. (2021). NeMo inverse text normalization: from development to production. Interspeech 2021. NVIDIA. NeMo text processing, commit ddadfb2.
McAuliffe, M. et al. (2017). Montreal Forced Aligner: trainable text-speech alignment using Kaldi. Interspeech 2017. Radford, A. et al. (2023). Robust speech recognition via large-scale weak supervision. ICML 2023.
Koizumi, Y. et al. (2023). LibriTTS-R: a restored multi-speaker text-to-speech corpus. Interspeech 2023. Wells, J. C. (1982). Accents of English. Cambridge University Press. Saeki, T. et al. (2022). UTMOS: UTokyo-SaruLab system for VoiceMOS Challenge 2022. Interspeech 2022.
Informe y archivos del estudio
Citar este informe
Shehzad, Asad (2026). Teaching Piper TTS to Read: Text Normalization and Word Timings. Loudness.ai, LA-RB-2026-002, versión 1.0.1. https://loudness.ai/research/piper-tts-text-normalization/ DOI: 10.5281/zenodo.23396091.