PIC_TINY_VOICE – INICIANDO C/ COMANDO DE VOZ – C/ PIC16F628A (REF306)

Você fala e o PIC “responde”!

Fazendo algumas pesquisas na internet a respeito de comando por voz encontrei um artigo da década de 90, onde o autor do artigo “Low-cost Voice Recognition“, Sr.Brad Stewart, propôs uma montagem usando um microcontrolador 68HC701J1A para reconhecimento de comandos por voz.
O que mais atraiu no artigo foi o uso de um microcontrolador que nem sequer possuía um conversor analógico/digital em seu hardware. Após ler o conteúdo do artigo, analisar o esquema e o princípio de funcionamento, fiquei tentado a montar o circuito para verificar o grau de funcionalidade. Mas esbarrei em um problema: o microcontrolador.
Não é muito fácil encontrar este microcontrolador em lojas de componentes, e quando se encontra, é na versão OTP (one time programmable), ou seja, só pode ser programado uma única vez. Não teria como fazer testes, mudar valores, incluir rotinas, etc. usando este tipo de microcontrolador. Outro inconveniente era o uso de uma memória externa ferroelétrica (mosca branca), a FM24C04. O diferencial dela é que tem um buffer longo, e não tem o tempo de delay na gravação de cerca de 2 a 4 milissegundos das EEprom seriais 24c04 tradicionais.
Então pensei em criar o código para um PIC, usando C ao invés de ASM, e seguir o método empregado no programa original do artigo. Após um estudo das necessidades, foi escolhido o PIC16F628A, por ter 2Kbyte de memória FLASH (programa) e uma RAM generosa de 224 bytes. E quanto a FM24C04? A solução foi usar a própria RAM e EEprom interna do PIC. Mas com apenas 224 bytes de RAM, já não seria possível ter 16 palavras gravadas para comparação como estava no artigo original. Mas poderia ter apenas 5, com a vantagem de acionar 5 pinos de saídas diretamente, sem ter de usar algum integrado para decodificar na saída. Podemos ver abaixo o esquema de como ficou a ligação dos componentes para esta montagem:

UMA BREVE DESCRIÇÃO DO CIRCUITO E SEU FUNCIONAMENTO

Conforme se pode ver neste esquema, foi também usado um amplificador operacional LM358 para filtrar o sinal proveniente do microfone de eletreto. O valores dos capacitores e resistores formam um filtro passa-altas situado na frequência da voz humana (500 a 5000 Herts aproximadamente). O pino 7 do LM358 fornece uma onda quadrada que segue exatamente as variações da voz emitida sobre o microfone. Ao invés de usar um conversor analógico para digital de 8 ou 10 bits de resolução, foi empregado um ‘conversor analógico para digital de apenas um bit’.
Dito de uma forma simples, o microcontrolador vai fazer amostragens nesta entrada (pino 18 do PIC) a cada 104 microssegundos e contar quantas ocorreram enquanto a entrada estava em ‘0’ e quantas enquanto em ‘1’. Sabemos que o inverso do período é frequência. Então, por este método se obtém uma aproximação da frequência do sinal de entrada.
No processo de aquisição da voz, foi usado 128 bytes de RAM em 2 grupos de 64 bytes (sendo um grupo para frequência alta acima de 1500 Hertz e outro abaixo deste valor). Quando apertarmos o botão ‘Recognize’ e começamos a falar no microfone, começa também as amostragens. Se a frequência obtida foi alta, então ela é somada no primeiro byte do grupo de 64. Do contrário, se for baixa, soma com o primeiro byte do outro grupo. Depois de 256 amostragens, repete o processo com o próximo byte, e assim sucessivamente até completar todo o buffer.
O tempo máximo que a pronuncia da palavra deve ser feita é obtido pela fórmula:

Tempo entre amostragem X número de amostragem por byte X número de bytes

No nosso caso: 0,000104 X 256 X 64 = 1,7 segundos.

Acima disto ocorrerá indicação de erro. Após a aquisição da palavra, temos sua ‘impressão digital’ gravada em 128 bytes de RAM. Temos agora que salvar na memória EEprom. Mas como fazer isto com 5 palavras de 128 bytes cada, se a EEprom tem somente 128 bytes?
Seguindo o “modus operadi” do artigo original, a solução está em salvar ‘normalizando’ em 24 bytes, divididos em 2 grupos de 12, um para a frequência alta e outro para baixa. A rotina emprega loops, somas sucessivas e divisão, para a conversão de valores. No nosso caso, fazemos esta ‘normalização’ colocando os resultados nos primeiros 24 bytes da RAM e em seguida, salvando na EEprom, se estivermos em modo “Train”. Em modo “Recognize” apenas comparamos estes 24 bytes com os já gravados na EEprom. A comparação é feita pelo método da soma de erros byte a byte entre as palavras comparadas. Segundo a teoria, a palavra que apresentar o menor valor da somatória de erros será a palavra ‘reconhecida’ e indicará isto acionando a saída correspondente.
O esquema mostra 5 interruptores: Reset, Sel, Train, Untrain e Recognize.
Reset – reseta o microcontrolador e desliga saídas, bem como todo processo em andamento será finalizado e direcionado ao início do programa.
Sel – seleciona qual canal será gravado. A indicação é feita acionando o canal correspondente e acendendo o led nele ligado.
Train – usado para gravar na EEprom uma palavra de comando. Primeiro selecione o canal, depois aperte brevemente ‘Train’, em seguida pronuncie a palavra a ser usada como comando. O ‘led Sampling’ piscará enquanto se fala no microfone. Se for aceita, apagará o led do canal. Caso de algum problema haverá indicação de código de erro por número de piscadas do ‘led Error’.
Untrain – usado para apagar todas as palavras gravadas na EEprom de uma única vez. Basta apertar e manter apertado por mais de 5 segundos. Ocorrerá uma indicação de 7 piscadas no ‘led Error’.
Recognize – aperte brevemente e pronuncie a palavra ‘comando’. Se for reconhecida acionará uma das saídas. Se não, ocorrerá indicação de erro por piscadas, no ‘led Error’.

No artigo original, a indicação de erro era feito nas 4 saídas em código hexadecimal. No nosso caso, preferimos usar um único led e faze-lo piscar por um determinado número de vezes.
O código de piscadas no led_error ficou desta forma :
2 piscadas -> palavra muito longa (acima de 1,7 segundos)
3 piscadas -> erro ao capturar a pronuncia de uma palavra
4 piscadas -> excedeu o tempo sem pronunciar uma palavra (time-out)
5 piscadas -> palavra não encontrada na memória
6 piscadas -> palavras similares foram gravadas ou nenhuma palavra foi gravada
7 piscadas -> neste caso não é erro, mas indica que o apagamento da EEprom foi realizado com sucesso

O ‘led On’ acende toda vez que um botão for pressionado e apaga quando o PIC entra em modo “Sleep”.
O ‘led Sampling’ permite verificar se está ocorrendo um som na entrada. O potenciômetro de 10K deve ser ajustado para o máximo ou um pouco menos. Tente ajustar para um melhor funcionamento.
As saídas S0 a S3 funciona no modo pulso, e quando reagem a um comando de voz, ficam ligadas por apenas 1 segundo e volta a desligar. Somente a saída S4 funciona em modo retenção, que alterna entre ligado e desligado a cada acionamento.

CONSIDERAÇÕES FINAIS QUANTO A FUNCIONALIDADE DO CIRCUITO

Após finalmente acabar a rotina, testa-la passo a passo, gravar no PIC e coloca-lo no circuito, passei aos testes de funcionamento prático.
Inicialmente tive dificuldades com a regulagem do potenciômetro de 10k. Cheguei por testes práticos, que seu valor deveria ficar no máximo ou pouco antes disso.
Em seguidas, usei várias palavras para testes. Notei que palavras curtas tendem a não serem aceitas gerando erros. Devem ser pronunciadas mais devagar. A constante #define SOUND_LIMITE determina o tamanho da palavra. Para palavras curtas use valor 8 e para mais longas 10.
Notei que muitas palavras podem ter a mesma ‘impressão digital’ ou similar. Após gravar 5 palavras, apertei o botão ‘Recognize’ e comecei a falar palavras diferentes das gravadas. Elas também ocasionalmente acionavam alguma saída.
Quando 2 palavras gravadas tem muita similaridade, poderá dar erro ao tentar fazer o reconhecimento.
As palavras devem ser selecionadas com cuidado. As vezes, deve ser trocadas para que não acione a mesma saída de outra anteriormente gravada.
Outro problema encontrado tem que ver com a distância do microfone até a boca e a força da voz. Grave com a mesma distância e força da voz que usará no reconhecimento.
Outro vilão do mau funcionamento é sem duvida o ruído ambiente. Um carro trafegando na frente de sua casa, um cachorro latindo, pessoas conversando, etc. podem fazer o reconhecimento ficar atrapalhado!
Acredito que o circuito original tenha manifestados estes mesmos problemas em uso. Mas nunca saberei pois não foi possível montar o circuito original para comparação.
Mesmo assim, fiquei impressionado com a capacidade de reconhecimento usando este método tão simples!
Mas, devido aos problemas já citados, então eu creio que isto dificulte tremendamente seu uso em aplicações práticas de comando de voz. Talvez possa ser usado como um circuito puramente didático como num trabalho escolar ou como base para um estudo mais profundo.
Talvez se possa pensar em alterar rotinas, aumentar as frequências e número de bytes nas amostragens, usar outras técnicas de normalização, FFT, rede neurais, etc. Um sistema que seja de reconhecimento ‘contínuo’ e ‘speaker independent’ seria um alvo excelente a ser alcançado, mas acredito que isto seja possível somente com o uso de um DSPic ou outro tipo de processador digital com mais capacidade de memória e velocidade de processamento.
Obs. Esta montagem é experimental, sendo de caráter didático, montada apenas em placa experimental (do tipo “Breadboard”), sujeita a “bugs” ainda não detectados. Está sendo fornecido os arquivos para que cada hobista possa alterar o programa segundo suas necessidades.

Segue pasta zipada com os arquivos da montagem:

voice_recognition

Vídeo caseiro com a montagem no BreadBoard:

Manuais:
PIC 16F628A DATASHEET
LM358 DATASHEET
Low-cost Voice Recognition (article)

Curiosidades:
As incríveis andorinhas do Ártico
O fruto da Pollia e seu azul impressionante
Alhazen
Uma visita à Nova Zelândia

Outros assuntos:
Cuide da saúde e seja positivo
Tenha um objetivo na vida
Quando os filhos saem de casa
‘Mais vale uma boa reputação do que muitas riquezas’

Vídeos:
As maravilhas de Jeová
Na frente dos meus olhos
Não desista mesmo quando te tratarem mal
Será que a morte é o fim de tudo?
Você Pode Ter uma Família Feliz!

Até o próximo artigo!

One comment on “PIC_TINY_VOICE – INICIANDO C/ COMANDO DE VOZ – C/ PIC16F628A (REF306)

  1. lario amei este artigo chegou na hora certa parabéns, não tinha idéia se poderia fazer este reconhecimento de voz com pic 16f628, falo sério fiquei surpreendido com este belo projeto valeu mesmo obrigado!!!

Comments are closed.

Back To Top