Software Bocal automático - Sinicizador de fala minúsculo
Esta é uma porta Go do grande sintetizador de fala do SAM. É basicamente uma reescrita semi-automática de C para o que foi, por sua vez, uma reescrita semi-automática de montagem para C :). Consequentemente, isso não deve ser legível.
Repo original: https://github.com/vidarh/sam. Com base nesse compromisso.
Como um desafio e apenas por diversão.
Sam é um programa muito pequeno de texto para fala (TTS) escrito em C, que é executado nas plataformas mais populares. É uma adaptação ao C do software de fala SAM (Software Automatic Mouth) para o Commodore C64 publicado no ano de 1982 pelo software Don't Ask (agora Softvoice, Inc.). Inclui um conversor de texto para fonema chamado Recitador e uma rotina de fonema para fala para a saída final. É tão pequeno que também funcionará em computadores incorporados. No meu computador, são necessários menos de 39kb (muito menor em dispositivos incorporados, pois a cabeça de over-o-sobrecarga não é necessária) do espaço em disco e é um programa totalmente independente. Para saída imediata, ele usa a biblioteca SDL, caso contrário, ele pode salvar arquivos .wav.
Uma versão on -line e executáveis para Windows podem ser encontrados no site: http://simulationcorner.net/index.php?page=sam
Basta digitar "Make" em seu prompt de comando. Para compilar sem SDL, remova as instruções SDL das variáveis CFLAGS e LFLAGS no arquivo "makefile".
Ele deve compilar em todos os sistemas operacionais do tipo UNIX. Para Windows, você precisa de Cygwin ou Mingw ( + Libsdl).
tipo
./sam I am Sam
para a primeira saída.
Se você desativou o SDL, tente
./sam -wav i_am_sam.wav I am Sam
Para obter um arquivo WAV. Este arquivo pode ser reproduzido por muitos players de mídia disponíveis para o PC.
Você pode experimentar outras opções como -Pitch Número -Speed Number -Throat Número -Mouth Número
Alguns valores típicos escritos no manual original são:
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
Pode até cantar olhar para o arquivo "cantar" para um pequeno exemplo.
Para a tabela de entrada do fonema, procure no wiki.
Uma descrição de recursos adicionais pode ser encontrada no manual original em http://www.retrobits.net/atari/sam.shtml ou no manual do programa Apple II equivalente http://www.apple-iigs.info/newdoc/sam.pdf
Este programa foi convertido semi-automático em C convertendo cada código OPCODBLER. por exemplo
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
Em seguida, foi reescrito manualmente remover a maioria dos saltos e registrar variáveis no código e renomear as variáveis para os nomes adequados. A maior parte da descrição abaixo é resultado desse processo de reescrita.
Infelizmente, ainda não é muito bom legível. Mas você deve ver onde eu comecei :)
Antes de tudo, vou me limitar aqui a uma descrição muito grosseira. Existem muitas exceções definidas no código -fonte que não explicarei. Além disso, muito código é desconhecido para mim EG Code47503. Para uma compreensão completa do código, preciso de mais tempo e, especialmente, mais olhos, dê uma olhada no código.
Ele altera o texto em inglês para fonemas por um conjunto de regras mostrado no wiki.
A regra "Ant (i)", "Ay", significa que, se ele encontrar um "eu" com letras anteriores "Ant", troque o i pelo fonema "Ay".
Existem alguns sinais especiais nessas regras como # & @ ^ +: % que podem significar, por exemplo, que deve haver um vocal ou uma consoante ou outra coisa.
Com a opção -debug, você obterá as regras correspondentes e os fonemas resultantes.
Aqui está a árvore completa das chamadas de sub -rotina:
Sammain () parser1 () parser2 () insert () copyStress () setPhoneMeLength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () é a rotina de entrada e chama todas as rotinas adicionais. Parser1 transforma a entrada do fonema e o transforma em três tabelas PhonemeIndex [] estresse [] PhoneMeLength [] (zero neste momento)
Estas tabelas agora estão alteradas:
Parser2 troca alguns fonemas por outros e insere novos. A copystress adiciona 1 ao estresse em algumas circunstâncias, o setphoneMeLength define comprimentos de fonemas. Code48619 Alterações O Código de Comprimentos de Phonemas41240 Adiciona alguns fonemas adicionais Code48431 possui algumas regras extras
O wiki mostra todos os fonemas possíveis e alguns campos de bandeira.
O conteúdo final dessas tabelas pode ser visto com o comando -debug.
Na função prepararOutput (), essas tabelas são parcialmente copiadas nas pequenas tabelas: PhonemeIndexOutput [] StressOutput [] PhoneMeLengthOutput [] para saída.
Exceto de alguns fonemas especiais, a saída é construída por uma combinação linear:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
onde ret é uma função retangular com a mesma periodicidade como o pecado. Parece realmente estranho, mas isso é realmente suficiente para a maioria dos tipos de fonemas.
Portanto, os fonemas acima são convertidos com algumas tabelas em arremessos [] frequência1 [] = f1 frequência2 [] = f2 frequência3 [] = f3 amplitude1 [] = a1 amplitude2 [] = a2 amplitude3 [] = a3
A fórmula acima é calculada em uma rotina omptimizada muito boa. Ele consiste apenas em 26 comandos:
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
O resto é tratado de uma maneira especial. No momento, não consigo descobrir de que maneira. Mas parece que ele usa algum ruído (por exemplo, "s") usando uma tabela com valores aleatórios.
O software é uma versão reversa de um software comercial publicado há mais de 30 anos. O atual detentor de direitos autorais é Softvoice, Inc. (www.text2speech.com)
Qualquer tentativa de entrar em contato com a empresa falhou. O site foi atualizado pela última vez no ano de 2009. O status do software original pode, portanto, melhor descrito como Abandonware (http://en.wikipedia.org/wiki/abandonware)
Desde que este for o caso, não posso colocar meu código em nenhuma licença de software de código aberto específico, use -o por sua conta e risco.
Se você tiver dúvidas, não hesite em me perguntar. Se você descobriu algum novo conhecimento sobre o código, envie -me.
Sebastian MacKe e -mail: [email protected]