Dibuja un discurso: Software boca automática

Concluí el artículo del año pasado "Dibujamos sonido" al reconocer: "¿Es posible dibujar sonido de una hoja en blanco sin rastrear el espectrograma de la grabación de audio? Francamente, no tuve éxito ". Pero recientemente me enteré de SAM , lanzado en 1982 por Don't Ask Software, fue el primer programa de síntesis de voz para PC comercialmente exitoso. A mediados de los años 2000, los evaluadores de demostración alemanes Tobias Korbmacher y Sebastian Macke tomaron una lista SAM ensamblada para Commodore 64 y la convirtieron en un código C ilegible, pero viable; luego, en 2014, el británico Vidar Hokstad trató de llevar el código C a una forma legible, dando manualmente a las variables nombres significativos y reemplazandogotoen bucles y ramas; y finalmente, en 2017, otro alemán Christian Schiffler reescribió el código de C a JavaScript. Puede probarlo en acción como un "cuadro negro" en discordier.imtqy.com/sam .

En mi opinión, un sintetizador de voz JavaScript primitivo es el modelo experimental más conveniente para aquellos que quieren entender cómo funciona la síntesis de voz en general. Mi bifurcación SAM con código y comentarios sustancialmente limpios está disponible en github.com/tyomitch/sam . Desafortunadamente, los autores anteriores lograron desvanecer el interés en SAM, y ahora no tienen tiempo para analizar las solicitudes de extracción para un proyecto de pasatiempos de larga data.

SAM consta de cuatro componentes funcionales:

  1. Reciter traduce el texto en inglés a un registro de fonema: por ejemplo, "A LITTLE TOO LOW" (un ejemplo del programa de demostración adjunto a SAM ) se convierte en "AH LIHTUL TUW5 LOW".
  2. El analizador convierte un registro fonémico en uno fonético: de "AH LIHTUL TUW5 LOW" resulta " AH, ,L,IH,DX,AX,LX, ,T,*,*,UX,WX, ,L,OW,WX". Para cada fondo que se muestra, Parser también establece la duración y el tono.
  3. Renderer construye un conjunto de frecuencias, amplitudes y otras características acústicas a partir de la grabación fonética;
  4. El último componente (función ProcessFrames) anónimo convierte una matriz de frecuencias y amplitudes en una transmisión PCM para salida de audio.

En este artículo, analizaré los cuatro componentes a su vez.

Recitador


Reciter se adjuntó a SAM como un programa separado: los creadores declararon que las reglas de pronunciación del Reciter 469 establecidas en el Reciter transcriben correctamente alrededor del 90% de las palabras en inglés. Esto significa que la transcripción de cada décima palabra necesitaba edición manual antes de enviarla a la entrada de los siguientes componentes.

SAM utiliza su propio sistema de transcripción , donde los fonemas en inglés se indican mediante caracteres separados de un conjunto [A-Z/]o en pares de dos de estos caracteres:
FonemaDesignacionFonemaDesignacionFonemaDesignacionFonemaDesignacion
/ b /B/ pags /P/ v /V/ f /F
/ d /D/ t /T/ z /Z/ s /S
/ dʒ /J/ tʃ /CH/ ʒ /ZH/ ʃ /SH
/ g /G/ k /K/ h //H/ ð /DH
/ m /M/ n /N/ ŋ /NX/ θ /TH
/ l /L/ r /R/ j /Y/ w /W
/ æ /AE/ ɛ /EH/ ɪ /IH/ yo /IY
/ ʌ /AH/ ɔ /AO/ ʊ /UH/ u /UX
/ ɒ /OH/ ɑ /AA/ ə /AX/ ɜ /ER
/ eɪ /EY/ aɪ /AY/ ɔɪ /OY/ aʊ /AW
/ oʊ /OW[l̩]UL[metro]UM[norte]UN
Además de los fonemas, los números 1–8 se usan en la transcripción SAM para denotar el estrés y el tono : 1 significa estrés “muy emocional”, 4 significa estrés normal, 6 significa tono neutro, 8 significa “caída extrema del tono”.

El recitador está organizado de manera bastante simple: las reglas sensibles al contexto de la lista se aplican alternativamente a la línea de entrada , por ejemplo, la regla " (IR)#=AYR" reemplaza el texto ⟨ir⟩ antes de la vocal con / aɪr /; la regla " .(S) =Z" reemplaza ⟨s⟩ entre la consonante sonora y el espacio (final de la palabra) con / z /; la regla " (U)^^=AH5" reemplaza ⟨u⟩ antes de dos consonantes seguidas con / ʌ /, y hace que la sílaba sea enfatizada. Es importante tener en cuenta que, en muchas palabras, Reciter no enfatiza ninguna vocal, y en algunas anota varias vocales a la vez: por ejemplo,la palabra "provocación" se convierte en "PRUW4VOW5KIHNX", es decir, / ˈpruˈvoʊkɪŋ /. Un lector atento notará que el estrés innecesario no es el único error en esta transcripción.

Decidí que la transcripción es la parte menos interesante del sintetizador de voz; y dada la calidad relativamente baja de la transcripción en la salida de Reciter, decidí Hay varios servicios de Internet disponibles gratuitamente para transcribir extractos de textos en inglés; en lugar de reglas heurísticas, estos servicios utilizan diccionarios bastante grandes. En mi experiencia, la transcripción de mejor calidad es para tophonetics.com y photransedit.com; Al mismo tiempo, el segundo tiene una serie de inconvenientes: utiliza una notación de fonema no estándar, destaca el estrés incluso en palabras monosilábicas y lo que es más inconveniente: está escrito en ASP.NET y requiere valores correctos en las solicitudes POST __VIEWSTATEy __EVENTVALIDATION, lo que complica su uso por parte de terceros sitios. Por lo tanto, en mi demostración del dispositivo y el trabajo de SAM, disponible en tyomitch.imtqy.com , utilicé la transliteración a través de https://cors-anywhere.herokuapp.com/https://tophonetics.com/

Analizador


A diferencia de Reciter, llamado así por los creadores de SAM, los ingenieros de reversa alemanes dieron nombres a los componentes del analizador y del procesador, por lo que estos nombres no reflejan con precisión el propósito de estos componentes.

El analizador tiene tres tareas principales:

  1. «» (, ) . ( ) «-» UL, UM, UN, [l̩, m̩, n̩]. , /əl, əm, ən/; Parser , AXL, AXM, AXN .
  2. , .. . «AH LIHTUL TUW LOW» , /t/ [ɾ] (DX) [t] (T,*,*) . ( .) , /l/ [ɫ] (LX) , [l] (L) .
  3. .

SAM admite 81 fondos, de los cuales 61 tienen nombres y se pueden usar en grabaciones de fonemas para "burlar" al analizador e inmediatamente configurar el sonido deseado. Los 20 fondos restantes no tienen nombre; 18 de ellos pueden aparecer solo como resultado del trabajo de Parser, y los fondos con los códigos 46 y 47 no pueden aparecer de ninguna manera, y probablemente permanecieron indeterminados por la supervisión de los desarrolladores de SAM. Los

fondos con los códigos 0–4 ( .?,-) corresponden al silencio; el resto se resume en la siguiente tabla:
El códigoDesignacionSonidoEl códigoDesignacionSonido
5 5IY[yo]42CH[t] en la composición / tʃ /
6 6IH[ɪ]43*[ʃ] como parte de / tʃ /
7 7EH[ɛ]44J[d] en la composición / dʒ /
8AE[æ]45*[ʒ] de / dʒ /
9 9AA[ɑ]48EY~ [ɜ] en / eɪ /
10AH[ʌ]49AY~ [ɑ] en / aɪ /
onceAO[ɔ]cincuentaOY[ɔ] de / ɔɪ /
12UH[ʊ]51AW[ɑ] en / aʊ /
treceAX[ə]52OW[ɔ] como parte de / oʊ /
14IXmás corto [ɪ]53UW~ [u]
quinceER[ɜ]54B[si]
dieciséisUX[u]55*
17OH[o]56*
DieciochoRX[ɹ]57D[re]
diecinueveLX[ɫ]58*
veinteWXcorto [ʊ] en diptongos59*
21YXcorto [ɪ] en diptongos60 60G[sol]
22WHmás largo [w]61*
23R[ɹ̠]62 62*
24L[l]63GX[sol]
25W[w]64*
26Y[j]sesenta y cinco*
27M[metro]66P[pags]
28N[norte]67*
29NX[norte]68*
treintaDX[ɾ]69T[t]
31Q[ʔ]70*
32S[s]71*
33SH[ʃ]72K[kʲ]
34F[F]73*
35TH[θ]74*
36/H[C]75KX[k]
37/X[h]76*
38Z[z]77*
39ZH[ʒ]78UL[l̩]
40V[v]79UM[metro]
41DH[re]80UN[norte]

Las acciones realizadas por Parser consisten en siete pasos:

  1. Analizando en sí: una lista de códigos de fondo y una lista paralela de tonos dados por números en la línea de entrada se forman en la línea de entrada.
  2. Aplicando un conjunto de dos docenas de reglas a la lista de fondos: por ejemplo, las sustituciones / t / + / r / → [tʃ] + [ɹ̠] y / k / + / vocal no frontal / → [k] + [vocal]. (/ k / delante de las vocales delanteras permanecen sin cambios y coinciden con el fondo [kʲ].)
  3. CopyStress: El tono establecido para las vocales estresadas se extiende a las consonantes que las preceden.
  4. SetPhonemeLength: la duración se sustituye por cada fondo (en "cuadros" condicionales). Se utilizan dos tablas de longitud de fondo: una para las sílabas acentuadas y otra para las sin tensión.
  5. AdjustLengths: Aplica un conjunto de siete reglas para ajustar la duración del fondo. Por ejemplo, las vocales antes de las consonantes sonoras se alargan una vez y media, y las consonantes explosivas consecutivas se reducen a la mitad.
  6. ProlongPlosiveStopConsonants: consonantes explosivas frente a vocales, las consonantes suaves y fricativas se dividen en triples de fondo. El primer fondo en los tres corresponde a una menor intensidad del sonido, el segundo a la intensidad completa, el tercero al silencio.
  7. InsertBreath: la frase se divide .?,-en "exhalaciones" por fondos "silenciosos" ( ) hasta 232 cuadros (esto es aproximadamente 2½ segundos). En una implementación SAM para PC retro, dicha partición era necesaria para ahorrar memoria; en la versión de JavaScript no tiene sentido, y en mi bifurcación se elimina.

El analizador genera tres listas paralelas: códigos de fondo, sus tonos y su duración.

Renderizador


Este componente es responsable de la síntesis del habla en el sentido estricto de la palabra. En la entrada, recibe una lista de fondos con tonos y duraciones específicos, así como parámetros que afectan la voz sintetizada. En la salida, produce ocho listas paralelas: las frecuencias de los formantes F 1 –F 3 , sus intensidades (amplitudes), la frecuencia principal F 0 (tono de voz) y los valores sampledConsonant, que se describirán con más detalle a continuación.

Con referencia a la instrucción SAM , se proporcionan los siguientes ejemplos de valores de parámetros de voz:
VotarVelocidadTonoGargantaBoca
Duende7264110160
Pequeño robot9260 60190190
Chico congestionado8272110105
Viejita8232145145
Extraterrestre10064150200
SAM7264128128
Dalek120100100200
Vale la pena señalar que el parámetro Velocidad no se usa en Renderer, sino que ya se encuentra en la etapa de generación de audio: la duración del sonido generado para un cuadro depende de este parámetro. Además del parámetro Velocidad, la duración del cuadro también depende del tipo de sonido, como se explicará a continuación.

La síntesis del discurso formante se basa en el hecho de que cada fondo está asociado con las frecuencias y amplitudes de los primeros formantes. Para la síntesis de vocales, el uso de dos formantes es suficiente; por ejemplo, un gráfico de frecuencias de formantes típico de las vocales inglesas tomado del sitio web de la Universidad de Manitoba :


para sintetizar consonantes, se necesitan formantes adicionales. Además, como mencioné en el artículo del año pasado , las consonantes ruidosas se caracterizan por "estallidos" en una amplia banda de frecuencias:



Estas "ráfagas" no pueden obtenerse por síntesis formante pura, por lo tanto, SAM reproduce los sonidos de consonantes ruidosas de la tabla de muestras. Los valores mencionados anteriormente sampledConsonantseleccionan la parte de la tabla correspondiente a la consonante ruidosa particular.

Las acciones realizadas por Renderer consisten en cinco pasos:

  1. SetMouthThroat: para vocales y fondos de sonor (códigos 5–29 y 48–53), los valores tabulados de las frecuencias F 1 y F 2 se multiplican por los parámetros Boca y Garganta, respectivamente.
  2. CreateFrames: . , (1–8) Pitch (1 → −32, 6 → 0, 8 → +12). , ( 30 ) , .
  3. CreateTransitions: F0–F3 F1–F3 . , , .
  4. F0 F1, «pitch contour», .
  5. , () , PCM.


Desde un punto de vista físico, el habla es un tren de pulso glótico creado por las cuerdas vocales (ver. Fig.), Que a lo largo del camino pasa a través de la boca y la nariz ( ruta del habla ), y aquellas como el resonador amplifican ciertos armónicos en la onda de la laringe. La frecuencia de la onda laríngea: esta es la frecuencia principal de la voz F 0 . Como regla, sus valores están entre 100 y 400 Hz: más bajos para los hombres, más altos para las mujeres, incluso más altos para los niños. El modelo de voz utilizado en la síntesis de formantes es que se aplican varios filtros de paso de banda a la onda de la laringe, cada uno de los cuales distingue un formante. El ancho de la banda asignada depende de la frecuencia del formante y, según los datos experimentales, es de hasta 200 Hz: en mi demostración de SAM en tyomitch.imtqy.com







Se utiliza este enfoque: con el valor predeterminado del parámetro Ancho de banda = 3, cada formante introduce armónicos F 0 en la señal de audio resultante dentro de ± 5.9% de la frecuencia del formante. Esto corresponde aproximadamente a los gráficos anteriores: el formante con una frecuencia de 3 KHz asigna un ancho de banda de 177 Hz. En la implementación clásica de SAM, la generación del número requerido de armónicos se abordó de manera más inventiva: para cada formante se genera una onda, pero la fase de esta onda se pone a cero con una frecuencia F 0 . En mi demostración, puede cambiar a un modo que sintetiza una onda para cada formante (pero sin poner a cero la fase) desmarcando el parámetro Pitch.

La función ProcessFramesen el SAM clásico procesa las consonantes ruidosas sordas y ruidosas por separado de todos los otros fondos:

  • . , Speed. ([s]) 105 , ([p] [t]) — 10.4 .
  • Speed16250PCM-, : () F1 F2, ( ) F3. , Speed=72 10.6 .
  • , , 34Speed16250PCM-, . , Speed . , Pitch=64, 1.6 , .. 9.5 .

Para las consonantes ruidosas, se utilizan cinco tablas de muestra: una para el alveolar ([t, s, z]), una para la cámara alveolar ([ʃ, ʒ]), una para el labial y dental ([p, f, v, θ, ð ]), y uno para [ç] y [h]. Las muestras relacionadas con la misma tabla difieren entre sí solo en duración e intensidad.

En mi demostración, en aras de la simplicidad, se genera un sonido de igual duración para todos los cuadros, y esta duración depende solo del parámetro Velocidad: con su valor predeterminado, un cuadro corresponde a 10,4 ms de sonido. Como muestran los experimentos, este "en promedio" corresponde al SAM clásico, aunque con respecto a él, los sonidos individuales en la frase sintetizada pueden "moverse" para unidades de ms hacia adelante o hacia atrás.

En conclusión, demostraré tres espectrogramas de la frase de bienvenida creada por el generador de audio SAM clásico y mi generador de audio con la síntesis de tono activada y desactivada:



como puede ver, al desactivar la síntesis de tono se logra un compromiso entre la calidad del sonido y la visibilidad de los formantes en el espectrograma.

All Articles