Desenhe um discurso: Boca automática de software

Concluí o artigo do ano passado "Nós desenhamos o som" reconhecendo: "É possível desenhar o som de uma folha em branco sem traçar o espectrograma da gravação de áudio? Francamente, não tive sucesso. " Mas eu aprendi recentemente sobre o SAM - lançado em 1982 pela Don't Ask Software, foi o primeiro programa de síntese de fala de PC comercialmente bem-sucedido. Em meados dos anos 2000, os avaliadores de demonstrações alemães Tobias Korbmacher e Sebastian Macke fizeram uma listagem de SAM montada para o Commodore 64 e a converteram em código C ilegível, mas viável; em 2014, o britânico Vidar Hokstad tentou colocar o código C em um formato legível - dando manualmente às variáveis ​​nomes significativos e substituindogotoem laços e galhos; e, finalmente, em 2017, outro alemão Christian Schiffler reescreveu o código de C para JavaScript. Você pode experimentá-lo em ação como uma "caixa preta" em discordier.imtqy.com/sam .

Na minha opinião, um sintetizador de fala JavaScript primitivo é o modelo experimental mais conveniente para quem deseja entender como a síntese de fala funciona em geral. Meu garfo SAM com código e comentários substancialmente limpos está disponível em github.com/tyomitch/sam . Infelizmente, os autores anteriores conseguiram diminuir o interesse no SAM e agora não têm tempo para analisar solicitações de recebimento de um projeto de hobby de longa data.

O SAM consiste em quatro componentes funcionais:

  1. O Reciter traduz o texto em inglês em um registro de fonema: por exemplo, "UM POUCO MUITO BAIXO" (um exemplo do programa de demonstração anexado ao SAM ) se transforma em "AH LIHTUL TUW5 LOW".
  2. O analisador transforma um registro fonêmico em fonético: de "AH LIHTUL TUW5 LOW", ele aparece " AH, ,L,IH,DX,AX,LX, ,T,*,*,UX,WX, ,L,OW,WX". Para cada plano de fundo exibido, o Analisador também define a duração e o tom.
  3. O renderizador cria um conjunto de frequências, amplitudes e outras características acústicas a partir da gravação fonética;
  4. O último componente anônimo (função ProcessFrames) transforma uma matriz de frequências e amplitudes em um fluxo PCM para saída de áudio.

Neste artigo, analisarei todos os quatro componentes por vez.

Recitador


O Reciter foi anexado ao SAM como um programa separado: os criadores afirmaram que as regras de pronúncia do Reciter 469 estabelecidas no Reciter transcrevem corretamente cerca de 90% das palavras em inglês. Isso significa que a transcrição de cada décima palavra precisava de edição manual antes de enviá-la para a entrada dos seguintes componentes.

O SAM usa seu próprio sistema de transcrição , onde os fonemas em inglês são indicados por caracteres separados de um conjunto [A-Z/]ou em pares de dois desses caracteres:
FonemaDesignaçãoFonemaDesignaçãoFonemaDesignaçãoFonemaDesignação
/ b /B/ p /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
/ eu /L/ r /R/ j /Y/ W /W
/ æ /AE/ ɛ /EH/ ɪ /IH/ Eu /IY
/ ʌ /AH/ ɔ /AO/ ʊ /UH/ você /UX
/ ɒ /OH/ ɑ /AA/ ə /AX/ ɜ /ER
/ eɪ /EY/ aɪ /AY/ ɔɪ /OY/ aʊ /AW
/ oʊ /OW[eu]UL[m̩]UM[n̩]UN
Além dos fonemas, os números de 1 a 8 são usados ​​na transcrição do SAM para indicar estresse e tom : 1 significa estresse "muito emocional", 4 significa estresse normal, 6 significa tom neutro, 8 significa "queda extrema no tom".

O recitador é organizado de maneira simples: regras sensíveis ao contexto da lista são aplicadas alternadamente à linha de entrada ; por exemplo, a regra " (IR)#=AYR" substitui o texto ⟨ir⟩ antes da vogal com / aɪr /; a regra " .(S) =Z" substitui ⟨s⟩ entre a consoante sonora e o espaço (final da palavra) por / z /; a regra " (U)^^=AH5" substitui ⟨u⟩ antes de duas consoantes seguidas por / ʌ /, e acentua a sílaba. É importante observar que, em muitas palavras, o Reciter não enfatiza nenhuma vogal e, em algumas, observa várias vogais ao mesmo tempo: por exemplo,a palavra "provocação" se transforma em "PRUW4VOW5KIHNX", ie / ˈpruˈvoʊkɪŋ /. Um leitor atento perceberá que estresse desnecessário não é o único erro nesta transcrição.

Decidi que a transcrição é a parte menos interessante do sintetizador de fala; e, dada a qualidade relativamente baixa da transcrição na saída do Reciter, decidi Existem vários serviços de Internet disponíveis gratuitamente para transcrever trechos de textos em inglês; em vez de regras heurísticas, esses serviços usam dicionários bastante grandes: na minha experiência, a melhor transcrição de qualidade é para tophonetics.com e photransedit.com; ao mesmo tempo, o segundo tem várias desvantagens: usa notação de fonemas não muito padrão, observa o estresse mesmo em palavras monossilábicas e o que é mais inconveniente - é escrito no ASP.NET e requer valores corretos nas solicitações POST __VIEWSTATEe __EVENTVALIDATION, o que complica seu uso de terceiros sites. Portanto, em minha demonstração do dispositivo e do trabalho do SAM, disponível em tyomitch.imtqy.com , usei a transliteração em https://cors-anywhere.herokuapp.com/https://tophonetics.com/

Analisador


Ao contrário do Reciter, assim chamado pelos criadores do SAM, os componentes Parser e Renderer receberam nomes de engenheiros reversos alemães, portanto esses nomes não refletem com precisão o objetivo desses componentes.

O analisador possui três tarefas principais:

  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. .

O SAM suporta 81 fundos, dos quais 61 têm nomes e podem ser usados ​​em gravações de fonemas para "superar" o analisador e definir imediatamente o som desejado. Os 20 fundos restantes não têm nome; 18 deles podem aparecer apenas como resultado do trabalho do Parser, e os fundos com os códigos 46 e 47 não podem aparecer de forma alguma e provavelmente permaneceram indeterminados pela supervisão dos desenvolvedores do SAM.Os

fundos com os códigos 0–4 ( .?,-) correspondem ao silêncio; o restante está resumido na tabela a seguir:
O códigoDesignaçãoSomO códigoDesignaçãoSom
5IY[Eu]42.CH[t] na composição / tʃ /
6IH[ɪ]43*[ʃ] como parte de / tʃ /
7EH[ɛ]44J[d] na composição / dʒ /
8AE[æ]45*[ʒ] de / dʒ /
9AA[ɑ]48.EY~ [ɜ] em / eɪ /
10AH[ʌ]49.AY~ [ɑ] em / aɪ /
onzeAO[ɔ]cinquentaOY[ɔ] de / ɔɪ /
12UH[ʊ]51AW[ɑ] em / aʊ /
trezeAX[ə]52OW[ɔ] como parte de / oʊ /
14IXmais curto [ɪ]53UW~ [u]
quinzeER[ɜ]54B[b]
dezesseisUX[você]55*
17OH[o]56.*
dezoitoRX[ɹ]57D[d]
dezenoveLX[ɫ]58*
vinteWXcurto [ʊ] em ditongos59.*
21YXcurto [ɪ] em ditongos60G[g]
22WHmais [w]61*
23R[ɹ̠]62*
24L[eu]63.GX[g]
25W[W]64*
26Y[j]65*
27M[m]66.P[p]
28.N[n]67*
29NX[ŋ]68*
trintaDX[ɾ]69T[t]
31Q[ʔ]70*
32.S[s]71*
33SH[ʃ]72K[kʲ]
34F[f]73*
35TH[θ]74*
36./H[ç]75KX[k]
37./X[h]76*
38.Z[z]77*
39.ZH[ʒ]78UL[eu]
40.V[v]79UM[m̩]
41.DH[ð]80UN[n̩]

As ações executadas pelo Analisador consistem em sete etapas:

  1. Analisando-se: uma lista de códigos de segundo plano e uma lista paralela de tons dados por números na linha de entrada são formados na linha de entrada.
  2. Aplicando um conjunto de duas dúzias de regras à lista de planos de fundo: por exemplo, as substituições / t / + / r / → [tʃ] + [ɹ̠] e / k / + / vogal não frontal / → [k] + [vogal]. (/ k / na frente das vogais da frente permanecem inalteradas e coincidem com o fundo [kʲ].)
  3. CopyStress: O tom definido para as vogais estressadas se estende às consoantes que as precedem.
  4. SetPhonemeLength: duration é substituído por cada plano de fundo (em "quadros" condicionais). Duas tabelas de longitude em segundo plano são usadas - uma para sílabas tônicas e outra para não estressadas.
  5. AdjustLengths: Aplica um conjunto de sete regras para ajustar as durações do plano de fundo. Por exemplo, as vogais antes das consoantes sonoras são prolongadas uma vez e meia e as consoantes explosivas consecutivas são reduzidas pela metade.
  6. ProlongPlosiveStopConsonants: consoantes explosivas na frente das vogais, consoantes fricativas e suaves são divididas em triplos fundos. O primeiro fundo nos três corresponde a uma intensidade de som mais baixa, o segundo à intensidade total, o terceiro ao silêncio.
  7. InsertBreath: a frase é dividida .?,-em “exalações” por fundos “silenciosos” ( ) até 232 quadros (aproximadamente 2 segundos e meio). Em uma implementação de SAM para PCs retro, essa partição era necessária para economizar memória; na versão JavaScript não faz sentido, e no meu fork é excluído.

O analisador gera três listas paralelas: códigos de segundo plano, seus tons e duração.

Renderer


Este componente é responsável pela síntese da fala no sentido estrito da palavra. Na entrada, ele recebe uma lista de fundos com tons e durações especificadas, bem como parâmetros que afetam a voz sintetizada. Na saída, ele produz oito listas paralelas: as frequências dos formantes F 1 –F 3 , suas intensidades (amplitudes), a frequência principal F 0 (tom de voz) e os valores sampledConsonant, que serão descritos em mais detalhes abaixo.

Com referência à instrução SAM , são fornecidos os seguintes exemplos de valores de parâmetros de voz:
VotoRapidezPassoGargantaBoca
Duende7264110160
Pequeno robô9260190190
Cara abafado8272110105
Velhinha8232.145145
Extraterrestre10064150200
SAM7264128128
Dalek120100100200
Vale ressaltar que o parâmetro Speed ​​não é usado no Renderer, mas já no estágio de geração do áudio: a duração do som gerado para um quadro depende desse parâmetro. Além do parâmetro Speed, a duração do quadro também depende do tipo de som, conforme será explicado abaixo.

A síntese da fala formante é baseada no fato de que cada fundo está associado às frequências e amplitudes dos primeiros formantes. Para a síntese de vogais, é suficiente o uso de dois formantes - por exemplo, um gráfico de frequências formantes típicas das vogais inglesas retiradas do site da Universidade de Manitoba :


Para sintetizar consoantes, são necessários formantes adicionais. Além disso, como mencionei no artigo do ano passado , as consoantes ruidosas são caracterizadas por "explosões" em uma ampla faixa de frequência:



Essas "explosões" não podem ser obtidas por síntese pura de formantes; portanto, o SAM reproduz os sons de consoantes ruidosas da tabela de amostras. Os valores mencionados acima sampledConsonantselecionam a parte da tabela correspondente à consoante barulhenta específica.

As ações executadas pelo Renderer consistem em cinco etapas:

  1. SetMouthThroat: para vogais e sonor backgrounds (códigos 5–29 e 48–53), os valores tabulados das frequências F 1 e F 2 são multiplicados pelos parâmetros Boca e 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.


Do ponto de vista físico, a fala é um trem de pulso glótico criado pelas cordas vocais (ver Fig.), Que ao longo do caminho passa pela boca e pelo nariz ( caminho da fala ), e aqueles como o ressonador amplificam certos harmônicos na onda da laringe. A frequência da onda laríngea - esta é a principal frequência da voz F 0 . Como regra, seus valores estão entre 100 e 400 Hz: mais baixo para homens, mais alto para mulheres e ainda mais para crianças. O modelo de voz usado na síntese de formantes é que vários filtros passa-banda são aplicados à onda da laringe, cada um dos quais distingue um formante. A largura da banda alocada depende da frequência do formante e, de acordo com dados experimentais, é de até 200 Hz: Na minha demonstração do SAM em tyomitch.imtqy.com







esta abordagem é usada: com o valor padrão do parâmetro Largura de banda = 3, cada formante introduz harmônicos F 0 no sinal de áudio resultante dentro de ± 5,9% da frequência do formante. Isso corresponde aproximadamente aos gráficos acima: o formante com uma frequência de 3 KHz aloca uma largura de banda de 177 Hz. Na implementação clássica do SAM, a geração do número necessário de harmônicos foi abordada de maneira mais inventiva: para cada formante, uma onda é gerada, mas a fase dessa onda é zerada com uma frequência F 0 . Na minha demonstração, você pode alternar para um modo que sintetiza uma onda para cada formante (mas sem zerar a fase) desmarcando o parâmetro Pitch.

A função ProcessFramesno SAM clássico processa consoantes surdas e sonoras emitidas separadamente de todos os outros antecedentes:

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

Para consoantes ruidosas, cinco tabelas de amostra são usadas: uma para a alveolar ([t, s, z]), uma para a câmara-alveolar ([ʃ, ʒ]), uma para a labial e a dental ([p, f, v, θ, ð ]) e um para [ç] e [h]. As amostras relacionadas à mesma tabela diferem entre si apenas em duração e intensidade.

Na minha demonstração, por uma questão de simplicidade, um som de duração igual é gerado para todos os quadros, e essa duração depende apenas do parâmetro Speed: em seu valor padrão, um quadro corresponde a 10,4 ms de som. Como mostram as experiências, essa "média" corresponde ao SAM clássico, embora, com relação a isso, os sons individuais da frase sintetizada possam "sair" por alguns ms para frente ou para trás.

Concluindo, demonstrarei três espectrogramas da frase de boas-vindas criada pelo clássico gerador de áudio SAM e meu gerador de áudio com a síntese de tons ativada e desativada:



como você pode ver, desativar a síntese de tons atinge um compromisso entre a qualidade do som e a visibilidade dos formantes no espectrograma.

All Articles