Pronunciación con SSML

Puede usar el Lenguaje de marcado de síntesis de voz (SSML) con conversión texto a voz para especificar cómo se pronuncia la voz. Por ejemplo, puede usar SSML con fonemas y un léxico personalizado para mejorar la pronunciación. También puede usar SSML para definir cómo se pronuncia una palabra o expresión matemática.

Consulte las secciones siguientes para obtener más información sobre cómo usar elementos SSML para mejorar la pronunciación. Para obtener más información sobre la sintaxis de SSML, consulte Estructura y eventos del documento de SSML.

Elemento fonema

El elemento phoneme se utiliza para la pronunciación fonética en los documentos SSML. Proporcione siempre una voz natural como reserva.

Los alfabetos fonéticos se componen de segmentos acústicos, que se componen de letras, números o caracteres, a veces en combinación. Cada segmento acústico describe un sonido de voz único. El alfabeto fonético contrasta con el alfabeto latino, donde cualquier letra puede representar múltiples sonidos hablados. Tenga en cuenta las pronunciaciones en-US diferentes de la letra "c" en las palabras "casa" y "cese" o, en inglés, las distintas pronunciaciones de la combinación de letras "th" en las palabras "thing" y "those".

Nota

Para una lista de las configuraciones regionales que admiten fonemas, consulte las notas al pie en la tabla de compatibilidad de idiomas.

El uso de los atributos del elemento phoneme se describe en la tabla siguiente.

Atributo Descripción Obligatorio u opcional
alphabet El alfabeto fonético que se utilizará al sintetizar la pronunciación de la cadena en el atributo ph. La cadena que especifica el alfabeto se debe especificar en minúsculas. Las siguientes opciones son los posibles alfabetos que puede especificar:
El alfabeto solo se aplica a phoneme en el elemento.
Opcional
ph Una cadena que contiene los segmentos acústicos que especifican la pronunciación de la palabra en el elemento phoneme. Si la cadena especificada contiene segmentos acústicos no reconocidos, la conversión de texto a voz rechaza todo el documento SSML y no produce ninguna de las salidas de voz especificadas en el documento.

En ipa, para acentuar una sílaba colocando el símbolo de acento antes de esta sílaba, debe marcar todas las sílabas de la palabra. O, de lo contrario, se acentúa la sílaba que hay antes del símbolo de acento. En sapi, si quiere acentuar una sílaba, debe colocar el símbolo de acento después de esta sílaba, independientemente de que se marquen o no todas las sílabas de la palabra.
Obligatorio

Ejemplos de fonema

Los valores admitidos para los atributos del elemento phoneme se describieron anteriormente. En los dos primeros ejemplos, los valores de ph="tə.ˈmeɪ.toʊ" o ph="təmeɪˈtoʊ" se especifican para acentuar la sílaba meɪ.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="ipa" ph="tə.ˈmeɪ.toʊ"> tomato </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="ipa" ph="təmeɪˈtoʊ"> tomato </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <phoneme alphabet="sapi" ph="iy eh n y uw eh s"> en-US </phoneme>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <s>His name is Mike <phoneme alphabet="ups" ph="JH AU"> Zhou </phoneme></s>
    </voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
     <voice name="en-US-AvaNeural">
        <phoneme alphabet='x-sampa' ph='he."lou'>hello</phoneme>
    </voice>
</speak>

Léxico personalizado

Puede definir cómo se leen las entidades únicas (como la empresa, un término médico o un emoji) en SSML mediante el fonema y subelementos. Para definir cómo se leen varias entidades, cree un archivo de léxico personalizado estructurado XML. Después, cargue el archivo XML de léxico personalizado y haga referencia a él con el elemento SSML lexicon.

Nota

Para una lista de las configuraciones regionales que admiten lexicones, consulte las notas al pie en la tabla de compatibilidad de idiomas.

Long Audio API no admite el elemento lexicon. Para texto a voz de formato largo, use la API de síntesis por lotes (versión preliminar) en su lugar.

El uso de los atributos del elemento lexicon se describe en la tabla siguiente.

Atributo Descripción Obligatorio u opcional
uri El URI del archivo XML de léxico personalizado accesible públicamente con la extensión de archivo .xml o .pls. Se recomienda usar Azure Blob Storage, pero no es necesario. Para más información sobre el archivo de lexicón personalizado, consulte Especificación del lexicón de pronunciación (PLS), versión 1.0. Obligatorio

Ejemplos de léxico personalizados

Los valores admitidos para los atributos del elemento lexicon se describieron anteriormente.

Una vez publicado el lexicón personalizado, puede hacer referencia a él desde su SSML. En el siguiente ejemplo de SSML se hace referencia a un léxico personalizado que se cargó en https://www.example.com/customlexicon.xml. Se admiten direcciones URL de léxico desde Azure Blob Storage, Advanced Media Services (AMS) Storage y GitHub. Sin embargo, tenga en cuenta que es posible que otras direcciones URL públicas no sean compatibles.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
          xmlns:mstts="http://www.w3.org/2001/mstts"
          xml:lang="en-US">
    <voice name="en-US-AvaNeural">
        <lexicon uri="https://www.example.com/customlexicon.xml"/>
        BTW, we will be there probably at 8:00 tomorrow morning.
        Could you help leave a message to Robert Benigni for me?
    </voice>
</speak>

Archivo de léxico personalizado

Para definir cómo se leen varias entidades, puede definirlas en un archivo XML de léxico personalizado con la extensión de archivo .xml o .pls.

Nota

El archivo de léxico personalizado es un documento XML válido, pero no se puede usar como documento SSML.

Estas son algunas limitaciones del archivo léxico personalizado:

  • Tamaño del archivo: el tamaño del archivo léxico personalizado está limitado a un máximo de 100 KB. Si el tamaño del archivo supera el límite de 100 KB, se produce un error en la solicitud de síntesis. Puede dividir el léxico en varios léxicos e incluirlos en SSML si el tamaño del archivo supera los 100KB.
  • Actualización de la caché de lexicón: el lexicón personalizado se almacena en caché con el identificador URI como clave en la conversión de texto a voz cuando se carga por primera vez. El lexicón con el mismo identificador URI no se vuelve a cargar en 15 minutos, por lo que el cambio de lexicón personalizado debe esperar 15 minutos como máximo para tener efecto.

Los elementos y atributos admitidos de un archivo XML de léxico personalizado se describen en la versión 1.0 de especificación de léxico de pronunciación (PLS). Estos son algunos ejemplos de los elementos y atributos admitidos:

  • El elemento lexicon contiene al menos un elemento lexeme. El lexicón contiene el atributo xml:lang necesario para indicar a qué configuración regional se debe aplicar. Un lexicón personalizado está limitado a una configuración regional por diseño, por lo que no funcionará al aplicarlo para otra configuración regional. El elemento lexicon también tiene un atributo alphabet para indicar el alfabeto usado en el léxico. Los valores posibles son ipa y x-microsoft-sapi.
  • Cada elemento lexeme contiene al menos un elemento grapheme y uno o varios elementos grapheme, alias y phoneme. El elemento lexeme distingue mayúsculas de minúsculas en el lexicón personalizado. Por ejemplo, si solo proporciona un fonema para el elemento lexeme "Hello", no funciona para el elemento lexeme "hello".
  • El elemento grapheme contiene texto que describe la ortografía.
  • Los elementos alias se usan para indicar la pronunciación de un acrónimo o un término abreviado.
  • El elemento phoneme proporciona texto que describe cómo se pronuncia un elemento lexeme. El límite entre sílabas es "." en el alfabeto IPA. El elemento phoneme no puede contener espacios en blanco cuando se usa el alfabeto IPA.
  • Cuando se proporcionan los elementos alias y phoneme con el mismo elemento grapheme, el elemento alias tiene prioridad.

Microsoft proporciona una herramienta de validación para el léxico personalizado que le ayuda a encontrar errores (con mensajes de error detallados) en el archivo de léxico personalizado. Se recomienda usar la herramienta antes de usar el archivo XML de léxico personalizado en producción con el servicio de voz.

Ejemplos de archivos de léxico personalizados

El siguiente ejemplo XML (no SSML) se incluirá en un archivo de léxico personalizado .xml. Cuando se usa este lexicón personalizado, "BTW" se lee como "By the way" y "Benigni" se lee con el IPA proporcionado "bɛˈniːnji".

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en-US">
    <lexeme>
        <grapheme>BTW</grapheme>
        <alias>By the way</alias>
    </lexeme>
    <lexeme>
        <grapheme>Benigni</grapheme>
        <phoneme>bɛˈniːnji</phoneme>
    </lexeme>
    <lexeme>
        <grapheme>😀</grapheme>
        <alias>test emoji</alias>
    </lexeme>
</lexicon>

No se puede establecer directamente la pronunciación de una frase mediante el lexicón personalizado. Si tiene que establecer la pronunciación de un acrónimo o un término abreviado, proporcione primero un elemento alias y, a continuación, asocie el elemento phoneme con dicho elemento alias. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en-US">
    <lexeme>
        <grapheme>Scotland MV</grapheme>
        <alias>ScotlandMV</alias>
    </lexeme>
    <lexeme>
        <grapheme>ScotlandMV</grapheme>
        <phoneme>ˈskɒtlənd.ˈmiːdiəm.weɪv</phoneme>
    </lexeme>
</lexicon>

También puede proporcionar directamente el alias esperado para el acrónimo o el término abreviado. Por ejemplo:

  <lexeme>
    <grapheme>Scotland MV</grapheme>
    <alias>Scotland Media Wave</alias>
  </lexeme>

Los ejemplos de archivos XML de léxico personalizado anteriores usan el alfabeto IPA, que también se conoce como el conjunto de teléfonos IPA. Se recomienda usar el IPA porque es el estándar internacional. En algunos caracteres del IPA, tienen la versión "precompuesta" y "descompuesta" cuando se representan con Unicode. El lexicón personalizado solo admite caracteres Unicode descompuestos.

El servicio de voz define un conjunto fonético para estas configuraciones regionales: en-US, fr-FR, de-DE, es-ES, ja-JP, zh-CN, zh-HK y zh-TW. Para más información sobre el alfabeto fonético del servicio de voz detallado, consulte los conjuntos fonéticos del servicio de voz.

Puede usar x-microsoft-sapi como valor del atributo alphabet con lexicones personalizados, como se muestra aquí:

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="x-microsoft-sapi" xml:lang="en-US">
  <lexeme>
    <grapheme>BTW</grapheme>
    <alias> By the way </alias>
  </lexeme>
  <lexeme>
    <grapheme> Benigni </grapheme>
    <phoneme> b eh 1 - n iy - n y iy </phoneme>
  </lexeme>
</lexicon>

Elemento Say-as

El elemento say-as indica el tipo de contenido (por ejemplo, un número o una fecha) del texto del elemento. Este elemento proporciona instrucciones al motor de síntesis de voz sobre cómo pronunciar el texto.

El uso de los atributos del elemento say-as se describe en la tabla siguiente.

Atributo Descripción Obligatorio u opcional
interpret-as Indica el tipo de contenido del texto de un elemento. Para obtener una lista de tipos, consulte la tabla siguiente. Obligatorio
format Proporciona información adicional sobre el formato preciso del texto del elemento para los tipos de contenido que pueden tener formatos ambiguos. SSML define formatos para los tipos de contenido que los usan. Consulte la tabla siguiente. Opcional
detail Indica el nivel de detalle con que se va a hablar. Por ejemplo, este atributo puede solicitar que el motor de síntesis de voz pronuncie signos de puntuación. No hay valores estándar definidos para detail. Opcional

Se admiten los siguientes tipos de contenido para los atributos interpret-as y format. Incluya el atributo format solo si la columna format no está vacía en esta tabla.

Nota:

Los valores characters y spell-out para el atributo interpret-as se admiten para todos los texto en configuraciones regionales de voz. Se admiten otros interpret-as valores de atributo para todas las configuraciones regionales de los siguientes idiomas: árabe, catalán, chino, danés, neerlandés, inglés, francés, finés, alemán, hindi, italiano, japonés, coreano, noruego, polaco, portugués, ruso, español y sueco.

interpret-as format Interpretación
characters, spell-out El texto se pronuncia como letras individuales (deletreadas). El motor de síntesis de voz pronuncia:

<say-as interpret-as="characters">test</say-as>

Como "T E S T".
cardinal, number Ninguno El texto se pronuncia como un número cardinal. El motor de síntesis de voz pronuncia:

There are <say-as interpret-as="cardinal">10</say-as> options

Como "Hay diez opciones."
ordinal None El texto se pronuncia como un número ordinal. El motor de síntesis de voz pronuncia:

Select the <say-as interpret-as="ordinal">3rd</say-as> option

Como "Seleccione la tercera opción".
number_digit Ninguno El texto se pronuncia como una secuencia de dígitos individuales. El motor de síntesis de voz pronuncia:

<say-as interpret-as="number_digit">123456789</say-as>

Como "1 2 3 4 5 6 7 8 9".
fraction None El texto se pronuncia como un número fraccionario. El motor de síntesis de voz pronuncia:

<say-as interpret-as="fraction">3/8</say-as> of an inch

Como "tres octavos de pulgada".
date dmy, mdy, ymd, ydm, ym, my, md, dm, d, m, y El texto se pronuncia como una fecha. El atributo format especifica el formato de la fecha (d=día, m=mes, y=año) . El motor de síntesis de voz pronuncia:

Today is <say-as interpret-as="date">10-12-2016</say-as>

Como "Hoy es el duodécimo de octubre dos mil dieciséis."
Pronuncia:

Today is <say-as interpret-as="date" format="dmy">10-12-2016</say-as>

Como "Hoy es diez de diciembre de dos mil dieciséis".
time hms12, hms24 El texto se pronuncia como una hora. El atributo format especifica si la hora se especifica mediante un reloj de 12 horas (hms12) o de 24 horas (hms24). Use un signo de dos puntos para separar los números que representan las horas, los minutos y los segundos. Estos son algunos ejemplos de horas válidas: 12:35, 1:14:32, 08:15 y 02:50:45. El motor de síntesis de voz pronuncia:

The train departs at <say-as interpret-as="time" format="hms12">4:00am</say-as>

Como "El tren sale a las cuatro A. M.".
duration hms, hm, ms El texto se pronuncia como una duración. El atributo format especifica el formato de la duración (h=hour, m=minute y s=second). El motor de síntesis de voz pronuncia:

<say-as interpret-as="duration">01:18:30</say-as>

Como "una hora, dieciocho minutos y treinta segundos".
Pronuncia:

<say-as interpret-as="duration" format="ms">01:18</say-as>

Como "un minuto y dieciocho segundos".
Esta etiqueta solo se admite en inglés y español.
telephone None El texto se pronuncia como un número de teléfono. El motor de síntesis de voz pronuncia:

The number is <say-as interpret-as="telephone">(888) 555-1212</say-as>

Como "Mi número es el código de área ocho ocho ocho cinco cinco cinco uno dos uno dos".
currency None El texto se pronuncia como una moneda. El motor de síntesis de voz pronuncia:

<say-as interpret-as="currency">99.9 USD</say-as>

Como "noventa y nueve dólares y noventa centavos estadounidenses".
address None El texto se pronuncia como una dirección. El motor de síntesis de voz pronuncia:

I'm at <say-as interpret-as="address">150th CT NE, Redmond, WA</say-as>

Como "Estoy en el número 150 de Court North East Redmond, en Washington".
name None El texto se pronuncia como el nombre de una persona. El motor de síntesis de voz pronuncia:

<say-as interpret-as="name">ED</say-as>

Como [æd].
En los nombres chinos, algunos caracteres se pronuncian de forma diferente cuando aparecen en un nombre de familia. Por ejemplo, el motor de síntesis de voz dice 仇 en

<say-as interpret-as="name">仇先生</say-as>

Como [qiú] en lugar de [chóu].

Ejemplos de say-as

Los valores admitidos para los atributos del elemento say-as se describieron anteriormente.

El motor de síntesis de voz pronuncia el ejemplo siguiente como "Su primera solicitud fue de una habitación el diecinueve de octubre de dos mil diez con llegada a las diecisiete treinta y cinco".

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaMultilingualNeural">
        <p>
        Your <say-as interpret-as="ordinal"> 1st </say-as> request was for <say-as interpret-as="cardinal"> 1 </say-as> room
        on <say-as interpret-as="date" format="mdy"> 10/19/2010 </say-as>, with early arrival at <say-as interpret-as="time" format="hms12"> 12:35pm </say-as>.
        </p>
    </voice>
</speak>

Subelemento

Use el elemento sub para indicar que el valor de texto del atributo del alias debe pronunciarse en lugar del texto incluido del elemento. De este modo, el SSML contiene un formulario hablado y escrito.

El uso de los atributos del elemento sub se describe en la tabla siguiente.

Atributo Descripción Obligatorio u opcional
alias Valor de texto que se debe pronunciar en lugar del texto incluido en el elemento. Obligatorio

Subejemplos

Los valores admitidos para los atributos del elemento sub se describieron anteriormente.

El motor de síntesis de voz pronuncia el ejemplo siguiente como "World Wide Web Consortium".

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AvaMultilingualNeural">
        <sub alias="World Wide Web Consortium">W3C</sub>
    </voice>
</speak>

Pronunciación con MathML

El Lenguaje de marcado matemático (MathML) es un lenguaje de marcado compatible con XML que describe contenido matemático y estructura. El servicio de Voz puede usar MathML como texto de entrada para pronunciar correctamente notaciones matemáticas en el audio de salida.

Nota:

Los elementos MathML (etiquetas) se admiten actualmente en las siguientes configuraciones regionales: de-DE, en-AU, en-GB, en-US, es-ES, es-MX, fr-CA, fr-FR, it-IT, ja-JP, ko-KR, pt-BR y zh-CN.

Se admiten todos los elementos de las especificaciones MathML 2.0 y MathML 3.0, excepto los elementos Elementary Math de MathML 3.0.

Tome nota de estos atributos y elementos MathML:

  • El atributo xmlns en <math xmlns="http://www.w3.org/1998/Math/MathML"> es opcional.
  • Los elementos semantics, annotation y annotation-xml no generan voz, por lo que se omiten.
  • Si no se reconoce un elemento, se omite y los elementos secundarios dentro de él se siguen procesando.

La sintaxis XML no admite las entidades MathML, por lo que debe usar los caracteres unicode correspondientes para representar las entidades, por ejemplo, la entidad &copy; debe representarse mediante sus caracteres unicode &#x00A9;, de lo contrario, se produce un error.

Ejemplos de MathML

La salida de texto a voz para este ejemplo es "a cuadrado más b cuadrado equivale a c cuadrado".

<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts' xml:lang='en-US'>
    <voice name='en-US-JennyNeural'>
        <math xmlns='http://www.w3.org/1998/Math/MathML'>
            <msup>
                <mi>a</mi>
                <mn>2</mn>
            </msup>
            <mo>+</mo>
            <msup>
                <mi>b</mi>
                <mn>2</mn>
            </msup>
            <mo>=</mo>
            <msup>
                <mi>c</mi>
                <mn>2</mn>
            </msup>
        </math>
    </voice>
</speak>

Pasos siguientes