reconhecimento de palavras usando redes neurais · década de 1950 instituições de pesquisa já...
TRANSCRIPT
UNIVERSIDADE FEDERAL DE SANTA CATARINA
Reconhecimento de Palavras
Usando Redes Neurais
Elton Vitor Seemann
Florianópolis – SC
2006 / 1
UNIVERSIDADE FEDERAL DE SANTA CATARINA
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE SISTEMAS DE INFORMAÇÃO
Reconhecimento de Palavras
Usando Redes Neurais
Elton Vitor Seemann
Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau de Bacharel em Sistemas de Informação.
Florianópolis – SC
2006 / 1
i
Elton Vitor Seemann
Reconhecimento de Palavras Usando Redes Neurais
Trabalho de conclusão de curso apresentado como parte dos requisitos
para obtenção do grau de Bacharel em Sistemas de Informação.
Orientador:
__________________________________ Prof. João Cândido Lima Dovicchi, Dr.
Coorientador:
__________________________________
Prof. Jovelino Falqueto, Dr.
Banca examinadora:
__________________________________ Prof. João Bosco da Mota Alves, Dr.
__________________________________ Wemerson Délcio Parreira, MSc.
ii
Resumo
Neste trabalho são abordadas técnicas de processamento digital de sinais que
permitem analisar o conteúdo do sinal de voz, mais especificamente a transformada de
Fourier (Short-time Fourier Transform) e a transformada Wavelet (Wavelet Discrete
Transform). Quatro diferentes métodos de extração de características do som de
palavras são aplicados aos sinais e o resultado do reconhecimento usando uma rede
neural e aprendizado supervisionado é apresentado. Também são discutidos detalhes da
topologia e regra de aprendizado da rede para o problema do reconhecimento de
palavras isoladas.
WAVELET, PROCESSAMENTO DIGITAL DE SINAIS, PROCESSAMENTO DE VOZ, REDES
NEURAIS ARTIFICIAIS.
iii
Abstract
This work describes techniques for digital signal processing that allow voice signal
analysis throuth its contents. These techniques use Short-time Fourier Transform
(STFT) and discrete Wavelet Transform (DWT). Four different methods of features
extraction were applied and results yielded were used in a supervisioned learning neural
network for recognition of words. Details of network topology and learning rules are
discussed to the problem.
WAVELET, DIGITAL SIGNAL PROCESSING, NEURAL NETWORKS.
iv
Sumário
LISTA DE FIGURAS.............................................................................................................................................V
LISTA DE TABELAS.........................................................................................................................................VII
LISTA DE QUADROS...................................................................................................................................... VIII
1 INTRODUÇÃO..................................................................................................................................................9
1.1 APLICAÇÕES DIVERSAS...............................................................................................................................10 1.2 ESCOPO.......................................................................................................................................................11
2 REDES NEURAIS ARTIFICIAIS.................................................................................................................14
2.1 CONCEITOS BÁSICOS...................................................................................................................................15 2.2 TOPOLOGIAS DE REDE.................................................................................................................................18 2.3 TREINAMENTO ............................................................................................................................................19
2.3.1 A lei de aprendizado do Perceptron................................................................................................20 2.3.2 Adaline (adaptative linear element) ................................................................................................23 2.3.3 Problemas linearmente não-separáveis ..........................................................................................25 2.3.4 O Perceptron multicamadas............................................................................................................27
3 PROCESSAMENTO DIGITAL DE SINAIS................................................................................................30
3.1 TRANSFORMADA DE FOURIER ....................................................................................................................30 3.2 SHORT-TIME FOURIER TRANSFORM (STFT) ..............................................................................................33 3.3 TRANSFORMADA WAVELET .......................................................................................................................37
4 METODOLOGIA............................................................................................................................................43
4.1 AQUISIÇÃO DOS SINAIS DE ÁUDIO...............................................................................................................43 4.2 EXTRAÇÃO DE CARACTERÍSTICAS ..............................................................................................................45
4.2.1 Extração com STFT.........................................................................................................................45 4.2.2 Extração com DWT .........................................................................................................................48
4.3 O CLASSIFICADOR ......................................................................................................................................51
5 RESULTADOS ................................................................................................................................................54
5.1 RESULTADO COM CÁLCULO DE CENTRÓIDES ..............................................................................................54 5.2 RESULTADOS COM STFT............................................................................................................................56 5.3 RESULTADOS COM DWT ............................................................................................................................58 5.4 RESULTADOS COM DWT (MÉTODO B) .......................................................................................................60 5.5 COMPARATIVO ENTRE MÉTODOS DE EXTRAÇÃO.........................................................................................62 5.6 O SUPERTREINAMENTO ..............................................................................................................................64 5.7 RESULTADOS UTILIZANDO SOFTWARE DE TERCEIROS ................................................................................66
5.7.1 Multi Layer Perceptron ...................................................................................................................68
6 CONCLUSÕES................................................................................................................................................70
REFERÊNCIAS.....................................................................................................................................................72
APÊNDICE A – CÓDIGO FONTE DA REDE NEURAL USADA NOS EXPERIMENTOS ......................76
APÊNDICE B – ALGORITMOS DE EXTRAÇÃO USANDO STFT.............................................................81
APÊNDICE C – ALGORITMOS DE EXTRAÇÃO USANDO DWT .............................................................85
ANEXO A – CÓDIGO FONTE DA FFT............................................................................................................87
ANEXO B – CÓDIGO FONTE DA TRANSFORMADA WAVELET DAUBECHIES 4 .............................90
v
Lista de Figuras
FIGURA 1.1 VISÃO SIMPLES DA PRODUÇÃO DA FALA (QUATIERI APUD (PARREIRA, 2005)) ................................... 12
FIGURA 1.2 ESPECTOGRAMA DA FALA, ADAPTADO DE (TRAUBE, 2006) ................................................................. 13
FIGURA 2.1 COMPONENTES BÁSICOS DE UMA REDE NEURAL ARTIFICIAL (KRÖSE & SMAGT, 1996) ....................... 16
FIGURA 2.2 FUNÇÕES DE ATIVAÇÃO (KOVÁCS, 1996)............................................................................................. 18
FIGURA 2.3 REDE DE CAMADA ÚNICA COM DUAS ENTRADAS E UMA SAÍDA ............................................................ 21
FIGURA 2.4 REPRESENTAÇÃO GEOMÉTRICA DA FUNÇÃO DISCRIMINANTE E DOS PESOS .......................................... 22
FIGURA 2.5 IMPLEMENTAÇÃO FÍSICA DO ADALINE ................................................................................................. 23
FIGURA 2.6 REPRESENTAÇÃO GEOMÉTRICA DO ESPAÇO DAS ENTRADAS ................................................................ 26
FIGURA 2.7 SOLUÇÃO DA FUNÇÃO XOR. ADAPTADO DE KRÖSE & SMAGT (1996) ................................................ 26
FIGURA 2.8 REDE MLP E A RETRO-PROPAGAÇÃO DOS ERROS (PATTERSON, 1995) ................................................ 28
FIGURA 3.1 AMOSTRAGEM EM FUNÇÃO DO TEMPO E SEU ESPECTRO (DOVICCHI 1999) .......................................... 31
FIGURA 3.2 JANELAMENTO DO SINAL ...................................................................................................................... 33
FIGURA 3.3 ELEMENTOS BASE DA STFT, ADAPTADO DE (CHAPLAIS, 1999). .......................................................... 34
FIGURA 3.4 EXEMPLO DE ELEMENTO BASE COM 10.5 PERÍODOS E JANELA DE HANNING ........................................ 35
FIGURA 3.5 ESPECTRO DO ELEMENTO BASE COM CORTE ABRUPTO (A) E JANELADO (B) POR FUNÇÃO DE
HANNING................................................................................................................................................ 35
FIGURA 3.6 ALGUMAS FUNÇÕES DE JANELAMENTO E SUAS TRANSFORMADAS COSSENO (WEISSTEIN, 2006A) ...... 36
FIGURA 3.7 ELEMENTOS BASE DA TRANSFORMADA WAVELET, ADAPTADO DE (CHAPLAIS, 1999)......................... 38
FIGURA 3.8 WAVELET MÃE 12Dψ , WAVELET COM ESCALA 1j −= E À DIREITA COM ESCALA 2j −= ............ 39
FIGURA 3.9 BANCO DE FILTROS DE 3 NÍVEIS............................................................................................................ 41
FIGURA 3.10 REPRESENTAÇÃO DA DWT NO DOMÍNIO DAS FREQÜÊNCIAS.............................................................. 41
FIGURA 3.11 ESTRUTURA LÓGICA DO RESULTADO DA DWT (KAPLAN, 2002) ....................................................... 42
FIGURA 4.1 GRAVADOR DIGITAL, A SETA VERMELHA INDICA O MICROFONE EMBUTIDO......................................... 43
FIGURA 4.2 DIFERENTES FUNÇÕES DE JANELAMENTO............................................................................................. 45
FIGURA 4.3 ESPECTRO DE FREQÜÊNCIA DE 7 FRAMES CONSECUTIVOS, EM VERMELHO O MESMO FRAME ............... 46
FIGURA 4.4 VALORES DAS CENTRÓIDES PARA (A) REPETIÇÕES DE UMA MESMA PALAVRA E (B) PALAVRAS
DIFERENTE .............................................................................................................................................. 46
FIGURA 4.5 ESPECTRO DE UM FRAME DIVIDIDO EM 5 REGIÕES................................................................................ 47
FIGURA 4.6 PROCESSO DE EXTRAÇÃO ..................................................................................................................... 47
FIGURA 4.7 FUNÇÃO WAVELET E FUNÇÃO ESCALONANTE DAUB4 ......................................................................... 48
FIGURA 4.8 EXTRAÇÃO: CINCO REPETIÇÕES, MESMA PALAVRA .............................................................................. 49
FIGURA 4.9 EXTRAÇÃO: CINCO PALAVRAS DIFERENTES.......................................................................................... 49
FIGURA 4.10 DIVISÃO DO PLANO TEMPO-FREQUENCIA RESULTANTE DA EXTRAÇÃO COM DWT ............................ 50
FIGURA 4.11 PROCESSO DE ORDENAÇÃO NO TEMPO PARA NÚMERO FIXO DE FRAMES POR SUB-BANDA.................. 50
FIGURA 4.12 TOPOLOGIA DO CLASSIFICADOR ......................................................................................................... 51
FIGURA 5.1CURVAS DE APRENDIZADO BASEADO NA EXTRAÇÃO DE CENTRÓIDES .................................................. 55
FIGURA 5.2 DISPERSÃO DOS VALORES DE SAÍDA DA REDE NO O CONJ. DE TESTE – EXTRAÇÃO DE CENTRÓIDES ..... 55
FIGURA 5.3 CURVAS DE APRENDIZADO BASEADO NA EXTRAÇÃO STFT ................................................................. 56
vi
FIGURA 5.4 DISPERSÃO DOS VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – EXTRAÇÃO STFT ........................ 57
FIGURA 5.5 CURVAS DE APRENDIZADO BASEADO NA EXTRAÇÃO DWT.................................................................. 58
FIGURA 5.6 GRÁFICO DE DISPERSÃO DOS VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – EXTRAÇÃO
DWT ...................................................................................................................................................... 59
FIGURA 5.7CURVAS DE APRENDIZADO BASEADO NA EXTRAÇÃO DWT (MÉTODO B).............................................. 60
FIGURA 5.8 GRÁFICO DE DISPERSÃO DOS VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – EXTRAÇÃO
DWT (MÉTODO B) ................................................................................................................................. 61
FIGURA 5.9 VALORES DE SAÍDA DA REDE NO CONJUNTO DE TESTE – EXTRAÇÃO COM MUITAS DIVISÕES ............... 62
FIGURA 5.10 VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – EXTRAÇÃO COM POUCAS DIVISÕES .................... 63
FIGURA 5.11 CURVAS DE APRENDIZADO PARA 10000 ÉPOCAS ................................................................................ 64
FIGURA 5.12 VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – DIFERENTES NÚMEROS DE ÉPOCAS..................... 64
FIGURA 5.13 CURVAS DE TREINAMENTO COM EXTRAÇÃO DWT ............................................................................ 67
FIGURA 5.14 CURVAS DE TREINAMENTO COM EXTRAÇÃO DWT MÉTODO B .......................................................... 67
FIGURA 5.15 CURVAS DE TREINAMENTO COM EXTRAÇÃO STFT DE 155 DIVISÕES ................................................. 67
FIGURA 5.16 CURVAS DE TREINAMENTO COM EXTRAÇÃO STFT DE 35 DIVISÕES ................................................... 67
FIGURA 5.17 CURVAS DE TREINAMENTO COM EXTRAÇÃO DE 31 CENTRÓIDES........................................................ 68
FIGURA 5.18 CURVA DE APRENDIZADO DO MLP COM 3 NÓS NA CAMADA ESCONDIDA .......................................... 69
FIGURA 5.19 CURVA DE APRENDIZADO DO MLP COM 70 NÓS NA CAMADA ESCONDIDA ........................................ 69
vii
Lista de tabelas
TABELA 1 TABELA VERDADE DO OU-EXCLUSIVO .................................................................................................... 25
TABELA 2 ESQUEMA DE GRAVAÇÃO DAS AMOSTRAS DE TESTE............................................................................... 44
TABELA 3 RESULTADOS DE CLASSIFICAÇÃO BASEADOS NO CÁLCULO DE CENTRÓIDES .......................................... 54
TABELA 4 3 RESULTADOS DE CLASSIFICAÇÃO BASEADOS NA STFT ....................................................................... 56
TABELA 5 RESULTADOS DE CLASSIFICAÇÃO BASEADOS NA EXTRAÇÃO DWT........................................................ 58
TABELA 6 RESULTADOS DE CLASSIFICAÇÃO BASEADOS NA EXTRAÇÃO DWT (MÉTODO B) ................................... 60
TABELA 7 ESTATÍSTICAS DOS VALORES DE SAÍDA DA REDE NO CONJUNTO DE TESTE – EXTRAÇÃO COM
MUITAS DIVISÕES.................................................................................................................................... 62
TABELA 8 ESTATÍSTICAS DOS VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – EXTRAÇÃO COM POUCAS
DIVISÕES................................................................................................................................................. 63
TABELA 9 ESTATÍSTICAS DOS VALORES DE SAÍDA DA REDE NO CONJ. DE TESTE – DIFERENTES NÚMEROS DE
ÉPOCAS ................................................................................................................................................... 65
TABELA 10 RESULTADOS UTILIZANDO ALGORITMOS DE REDES NEURAIS DO SAS.................................................. 66
viii
Lista de Quadros
QUADRO 1 HISTÓRICO DO DESENVOLVIMENTO DE SOFTWARE DE PROCESSAMENTO DE VOZ.................................. 10
9
1 INTRODUÇÃO
A área de Inteligência Artificial conhecida como processamento de voz teve seu
surgimento com a idéia de emitir ordens para o computador usando a fala. Desde o final da
década de 1950 instituições de pesquisa já estudavam meios de fazer com que a voz fosse
processada pelo computador. E, antes mesmo da Internet ter alcançado popularidade,
empresas já estavam comercializando programas para PC's com tecnologia de voz.
Corriqueiramente, a expressão “reconhecimento de voz” é utilizada com vários sentidos,
que na verdade refere-se a tecnologias distintas. O processamento da voz pode ser aplicado
em quatro áreas principais: comandos por voz, fala natural, síntese de voz e autenticação por
voz.
O reconhecimento de palavras (ou comando de voz) processa um pequeno trecho de fala
para identificar que tipo de ação o sistema deve tomar. Em uma central de atendimento
telefônico, num palm, celular ou PC, o usuário pode usar a fala em vez de apertar botões.
O reconhecimento da fala natural envolve uma ou mais frases, ou seja, várias palavras que
tenham um sentido semântico. Na síntese de voz, o sintetizador recebe um texto e o
transforma em ondas sonoras, fazendo uma “leitura em voz alta”.
Já a autenticação se baseia no fato de que a voz é única para cada pessoa e pode ser
utilizada para identificar alguém. Os sistemas de autenticação podem ser aplicados para
permitir o acesso de uma pessoa a determinado recurso. Hoje vários sistemas estão sendo
usados de maneira comercial onde a porcentagem de reconhecimento correto pode chegar a
99% (Peacocke & Graf apud (Parreira, 2005)).
10
Quadro 1 Histórico do desenvolvimento de software de processamento de voz
Final da década de 1950: Primeiras pesquisas tecnológicas para o reconhecimento de voz. 1964: IBM apresenta um sintetizador de voz para a fala de dígitos. 1978: A Texas Instruments lançou o primeiro chip dedicado à síntese de voz.
1993: IBM lança o primeiro software comercial para reconhecimento de voz, o IBM Personal Dictation System, para OS/2.
1993: Apple apresenta conjunto de rotinas para Mac, para reconhecimento e síntese de voz.
1993: Universidade Federal do Rio de Janeiro desenvolve Dosvox, com síntese de voz em português, para deficientes visuais usarem PC's com DOS.
1994: Dragon Systems apresenta o Dragon Dictate para ditados.
1996: IBM apresenta o MedSpeak/Radiology, primeiro produto para reconhecimento da fala contínua em tempo real.
1996: OS/2 Warp é o primeiro sistema a embutir comandos de voz.
1997: Dragon Systems lança o primeiro programa de uso geral para reconhecimento da fala contínua em inglês.
1997: IBM lança o ViaVoice, para fala contínua. 1998: IBM lança ViaVoice em português. 1998: MicroPower lança DeltaTalk, sintetizador de voz em português. 1999: Philips lança FreeSpeech 2000, com reconhecimento da fala em português. 1999: Lotus e Corel acrescentam recursos de voz a seus pacotes de aplicativos. 2000: L&H adquire Dragon Systems e lança L&H Dragon NaturallySpeaking 5.0.
2001: Telemar lança Vocall, primeiro serviço de voz aberto ao público, com síntese e reconhecimento da fala, para e-mails e agenda.
2001: L&H é colocada à venda, por se encontrar em grave crise financeira.
2001: Microsoft acrescenta recursos de voz (para ditados e comandos) ao Office XP. Na versão em português, essa facilidade está ausente.
Fonte: Revista PCWORD (Goya, 2002).
1.1 Aplicações diversas
Vários produtos podem ser encontrados no mercado de reconhecimento de voz, e novas
aplicações, como os portais de voz e outras aplicações dentro do CRM1, surgem a partir do
novo recurso de interface que a tecnologia de processamento de voz proporciona. A seguir,
alguns dos softwares disponíveis no mercado:
• Philips FreeSpeech, em português, não comercializado isoladamente para o usuário
final, mas apenas para parceiros que queiram integrar a solução a outros
aplicativos;
1 Customer Relationship Management
11
• IBM ViaVoice em português, plataforma Windows. A versão Pro aceita ditados
em qualquer aplicativo do Windows e reconhece comandos de voz para navegação
no Windows e na Web. Faz ainda a conversão de texto em fala;
• IBM Home Page Reader, que faz a leitura de páginas da Web. Faz a leitura em voz
alta de toda informação contida na página, incluindo links, tabelas, ocorrência de
gráficos, texto em colunas, campos de entrada de dados e mapas clicáveis (IBM,
2006a);
• IBM Embedded ViaVoice Enterprise Edition Software Developers Kit, um
midleware que permite: Reconhecimento de fala natural; Vocabulários
independentes de locutor; Acesso ativo a bases de dados de voz de capacidade
ilimitada; Síntese de voz; Alterna dinamicamente ente idiomas na síntese de voz. A
IBM também oferece serviço de geração de bases de dados de voz (IBM, 2006b);
• Sistema Telephony, da IBM, acoplado a centrais telefônicas, para atendimento
automatizado;
• Portais de voz, como o Vocall, lançado pela Telemar em 2001 em São Paulo e Rio
de Janeiro. Permite ler e enviar e-mails, consultar agenda de endereços e
compromissos, e outros conteúdos de voz, como informações sobre o tempo,
temperatura e hora certa.
1.2 Escopo
Como vimos, a área de processamento de voz é bastante ampla, e soluções efetivas já se
encontram disponíveis. O tema deste trabalho abrange o reconhecimento de palavras isoladas
(ou comandos).
O problema de reconhecer palavras pode ser dividido em três partes: a aquisição do sinal,
a extração de características e a classificação. A aquisição envolve simplesmente a captura do
sinal sonoro e digitalização. A extração envolve o processamento digital do sinal a fim de
12
extrair parâmetros que o representem o melhor possível, ou seja, características necessárias e
suficientes para o seu reconhecimento. A classificação consiste em fazer uso das informações
quantizadas (padrões) na construção de um modelo capaz de reconhecer novas ocorrências de
um conjunto pré-determinado de palavras, ou simplesmente classificar um sinal (quantizado)
em uma destas classes.
Figura 1.1 Visão simples da produção da fala (Quatieri apud (Parreira, 2005))
Quando falamos em reconhecer comandos de voz, estamos falando em classificar sinais
sonoros de diferentes palavras compostas por diferentes fonemas que, em nível mais básico,
possuem diferentes formas de onda e conteúdo de freqüência. Veja a figura 1.1: a voz humana
é produzida quando o ar expiratório (vindo dos pulmões) passa pelas pregas vocais, que por
nosso comando neural, por meio de ajustes musculares, faz pressões de diferentes graus na
região abaixo das pregas vocais, fazendo-as vibrarem.
Não podemos esquecer que voz é som, e som é igual à onda sonora. O ar expiratório, que
fez as pregas vocais vibrarem vai sendo modificado e os sons vão sendo articulados (vogais e
consoantes). Depois, emitidos pela boca e nariz, formam a onda sonora que vai atingir a
13
cóclea do ouvinte. Diferentes fonemas apresentam diferentes regiões formantes, como é
mostrado na figura 1.2.
Figura 1.2 Espectograma da fala, adaptado de (Traube, 2006)
Neste trabalho abordaremos técnicas de processamento digital de sinais que permitem
analisar o conteúdo do sinal de voz. Uma vez extraídas estas características, partiremos para a
classificação (ou reconhecimento) usando redes neurais e aprendizado supervisionado.
Objetivos principais:
• Estudar e aplicar técnicas de processamento digital de sinais na extração de
parâmetros do sinal discreto de áudio; Avaliar diferentes técnicas;
• Avaliar o uso das redes neurais como classificador neste contexto; Escolher a
melhor arquitetura; Avaliar o resultado do conjunto (rede neural e método de
extração);
• Construção de um protótipo completo em linguagem Java (construído ao longo das
etapas citadas acima).
14
2 REDES NEURAIS ARTIFICIAIS
A primeira onda de interesse nas redes neurais (também conhecidas por “modelos
conexionistas”) surgiu após a introdução dos neurônios simplificados de McCulloch e Pitts
em 1943 (McCulloch & Pitts, 1988). Estes neurônios foram apresentados como modelos do
neurônio biológico e como componente conceitual para circuitos capazes de executar tarefas
computacionais.
Em 1959 Frank Rosenblatt criou uma rede de múltiplos neurônios do tipo discriminadores
lineares e a batizou de rede perceptron. Rosenblatt baseou-se nas linhas de pensamento de
McCulloch e Pitts para desenvolver seu modelo.
Enquanto Rosenblatt trabalhava no perceptron, Bernard Widrow da Universidade de
Stanford desenvolvia um novo modelo de processamento batizado de Adaline2 (Widrow &
Hoff, 1988). As redes Adaline se destacavam pela poderosa lei de aprendizado, o princípio de
treinamento que ficou conhecido como Regra Delta.
Quando Minsky e Papert publicaram seu livro Perceptrons em 1969 (Minsky & Papert,
1988) onde demonstravam as deficiências dos modelos perceptron, a maioria dos
investimentos foi redirecionada e os pesquisadores abandonaram a área, com exceção de
alguns poucos.
O interesse nas redes neurais reapareceu somente a partir de alguns resultados teóricos
importantes alcançados no começo da década de oitenta (mais notoriamente a descoberta da
retro-propagação dos erros ou backpropagation) e novos avanços no desenvolvimento do
hardware que aumentaram a capacidade de processamento.
Redes neurais artificiais são caracterizadas mais adequadamente como “modelos
computacionais” com propriedades particulares como capacidade de adaptação ou
aprendizado, de generalização, ou de organização dos dados, e cuja operação é baseada em 2 Adaptative Linear Element, publicado em 1960
15
processamento paralelo (Kröse & Smagt, 1996). No entanto, várias destas características estão
presentes em outros tipos de modelos; a questão é até que ponto a abordagem neural prova ser
mais adequada a determinadas aplicações que os modelos existentes.
Hoje em dia a maior parte dos pesquisadores concorda que as redes neurais são muito
diferentes do cérebro em termos de estrutura. No entanto, como o cérebro, uma rede neural é
uma coleção massivamente paralela de unidades de processamento pequenas e simples, onde
as interligações formam a maior parte da inteligência da rede.
Principais características das Redes Neurais (Barone, 1999):
• capacidade de “aprender” através de exemplos e de generalizar este aprendizado de
forma a reconhecer elementos similares não apresentados no conjunto de
treinamento;
• bom desempenho em tarefas pouco ou mal definidas, onde falta o conhecimento
explícito de como resolvê-las;
• robustez à presença de informações falsas ou ausentes;
• tolerância à falha.
2.1 Conceitos básicos
Uma rede artificial consiste de um agrupamento de unidades simples de processamento
que se comunicam enviando sinais uma para a outra a partir de um grande número de
conexões e seus pesos.
Um conjunto de aspectos principais pode ser definido em um modelo neural (McClelland
& Rumelhart (apud Kröse & Smagt, 1996, p.15)):
• um conjunto de unidades de processamento (“neurônios”, “células”);
• um estado de ativação κy para cada unidade, o que equivale a saída da unidade
16
• conexões entre as unidades. Geralmente cada conexão é definida por um peso
jkw que determina o efeito que o sinal vindo da unidade j tem em k ;
• uma regra de propagação, que determina a entrada efetiva ks de uma unidade a
partir de suas entradas externas;
• uma função de ativação kF que determina o novo nível de ativação baseada na
entrada efetiva (t)sk e o estado de ativação atual (t)y k ;
• uma entrada externa (chamado de viés ou bias) kθ para cada unidade;
• um método para tratamento das informações (regra de treinamento);
• um ambiente com o qual o sistema interage, que fornece os sinais de entrada e – se
necessário – sinais de erro.
Cada unidade faz um trabalho relativamente simples: recebe entrada dos vizinhos ou fonte
externa e a usa para computar o sinal de saída propagado para as outras unidades.
Independente desta primeira, uma segunda tarefa é o ajuste dos pesos das conexões. Segundo
Kröse & Smagt (1996) trata-se de um sistema inerentemente paralelo no sentido de que
muitas unidades podem fornecer o resultado de sua computação ao mesmo temo.
Figura 2.1 Componentes básicos de uma rede neural artificial (Kröse & Smagt, 1996)
17
A figura 2.1 mostra os elementos de uma unidade de processamento. No caso, a regra de
propagação usada é a soma ponderada pelos pesos.
Dentro de uma rede neural é interessante distinguir três tipos de unidades: as unidades de
entrada (indicada pelo índice i) que recebem dados de fora da rede neural, unidades de saída
(indicadas pelo índice o) que mandam o sinal pra fora da rede, e as unidades escondidas ou
hidden (indicadas pelo índice h) das quais os sinais de entrada e saída continuam dentro da
rede.
Cada unidade responde por uma parcela da entrada das unidades a ela conectadas. A
entrada total para uma unidade k é simplesmente a soma ponderada das saídas vindas de cada
unidade a ela conectada mais um termo de viés:
A contribuição no caso de um peso positivo é considerada como uma excitação e para um
peso negativo como uma inibição. Unidades com esta regra de propagação são chamadas
unidades sigma.
O efeito da entrada total sobre a ativação da unidade é determinado pela função de
transferência kF que toma o total de entrada (t)sk e o estado de ativação corrente (t)y k e
produz o novo valor de ativação da unidade k :
Freqüentemente, a função de ativação é uma função não-decrescente da entrada total da
unidade:
Geralmente algum tipo de função de limiar é usado: função de limite ríspido, ou uma
função linear ou semilinear, ou uma função mais suave como a sigmóide (formato de S).
18
Figura 2.2 Funções de ativação (Kovács, 1996)
Em certas aplicações a tangente hiperbólica é usada, o que permite valores de saída no
intervalo 1] [-1, .
2.2 Topologias de rede
Quanto ao padrão de conexão entre as unidades e a propagação dos dados podemos
distinguir dois tipos de rede (Kröse & Smagt, 1996 p.17):
• diretas (feed-forward) ou acíclicas, onde o fluxo de dados das unidades de entrada
para as saídas é estritamente no sentido direto. O processamento dos dados pode se
entender sobre múltiplas camadas de unidades, entretanto não estão presentes
realimentações, ou seja, conexões partindo das saídas de unidades para a entrada
de unidades de camadas anteriores ou da mesma camada;
• retro-alimentadas ou cíclicas contém conexões de realimentação. Ao contrário das
redes acíclicas, as propriedades dinâmicas da rede são importantes. Em alguns
casos, os valores de ativação das unidades causam um processo no qual a rede é
levada a um estado estável, onde estes valores de ativação não mudam mais.
19
Podemos citar como exemplos de redes recorrentes as redes de Kohonen e
Hopfield. Esta última também é conhecida como memória de Hopfield.
Uma aplicação típica das redes feed-forward consiste na construção de modelos para
reconhecimento de padrões e classificação. Uma rede feed-forward pode ser vista como uma
ferramenta que realiza a análise de regressão não linear (Nascimento, 1994). Exemplos
clássicos de redes retroalimentadas são o Perceptron e o Adaline (ADAptive LInear Element).
2.3 Treinamento
Uma rede neural tem que ser configurada de maneira que a aplicação de um conjunto de
entradas produza o conjunto de saídas desejado. Existem vários métodos para se definir a
intensidade das conexões. Uma maneira seria atribuir os pesos explicitamente, usando um
conhecimento a priori. A outra forma consiste em “treinar” a rede neural alimentando ela com
padrões de treinamento e deixando-a mudar seus pesos internos de acordo com alguma regra
de aprendizado.
Os métodos de aprendizado das redes neurais estão divididos em dois paradigmas
principais:
• treinamento supervisionado ou associativo, onde a rede é treinada pelo
fornecimento dos padrões de entrada e respectivas saídas desejadas. Estes pares
entrada-saída (padrões) podem ser fornecidos por um agente externo, ou pelo
próprio sistema que contém a rede (auto-supervisionado);
• treinamento não-supervisionado, onde uma unidade (de saída) é treinada para
responder a clusters de padrões contidos na entrada. Neste paradigma o sistema
tenta detectar características estatísticas salientes na população da entrada. Ao
contrário do paradigma supervisionado, não existe um conjunto de categorias pré-
definidas nas quais os padrões precisam ser classificados; ao invés disso o sistema
tem que desenvolver sua própria representação.
20
Ambos os paradigmas resultam no ajuste dos pesos das conexões entre as unidades, de
acordo com alguma regra de aprendizado. Virtualmente todas as regras de aprendizado para
modelos deste tipo podem ser consideradas como uma variação da regra de treinamento
sugerida em 1949 por Hebb em seu livro Organization of Behavior (Hebb, 1988). A idéia
básica é que se duas unidades j e k são ativadas simultaneamente, então suas interconexões
tem que ser reforçadas. Se j recebe estímulo de k , a mais simples versão da lei de Hebb
manda atualizar o peso jkw com
onde γ é uma constante positiva de proporcionalidade que representa a taxa de treinamento.
Uma outra regra, ao invés da atual ativação da unidade k, usa a diferença entre o valor atual e
o desejado para ajustar os pesos:
onde kd é a ativação desejada, fornecida pelo conjunto de treinamento. Esta regra de
treinamento é conhecida por regra de Widrow-Hoff ou regra delta.
Neste trabalho detalharemos apenas o paradigma de treinamento supervisionado das redes
feed-forward.
2.3.1 A lei de aprendizado do Perceptron
Uma rede feed-forward de camada única consiste de um ou mais neurônios de saída o ,
cada qual conectado por um peso iow a cada uma das entradas i . Na forma mais simples a
rede possui apenas duas entradas e saída única, conforme mostra a figura 1.3.
21
Figura 2.3 Rede de camada única com duas entradas e uma saída
A entrada do neurônio é a soma ponderada das entradas mais o termo de viés. A saída é
formada pela ativação do neurônio de saída, que é alguma função da entrada:
A função de ativação pode ser linear de modo que teríamos uma rede linear, ou não-linear.
Consideremos a função de limiar:
A saída da rede neural será então +1 ou -1 dependendo da entrada. A rede pode agora ser
usada para uma tarefa de classificação: decidir se um padrão de entrada pertence a uma entre
duas classes. Se a entrada total é positiva, a amostra será atribuída à classe +1, se a entrada
total é negativa, a amostra será atribuída à classe -1. A separação entre estas duas classes
neste caso é uma reta, dada pela equação:
Uma rede de camada única representa uma função discriminante linear (Kröse & Smagt,
1996). Isolando 2x e reescrevendo a equação:
podemos ver que os pesos determinam o ângulo da reta e o termo de viés θ define o quanto a
reta fica afastada da origem. Os pesos também podem ser representados no espaço das
entradas: o vetor de pesos é sempre uma reta perpendicular à função discriminante. Observe a
representação no espaço das entradas (figura 2.4):
22
Figura 2.4 Representação geométrica da função discriminante e dos pesos
Suponhamos um conjunto de treinamento composto de vetores de entrada x e a saída
desejada )(xd . A regra de treinamento do perceptron é muito simples:
• Comece com valores randômicos para os pesos;
• Selecione um vetor de entrada x do conjunto de treinamento;
• Se )(xdy ≠ (o perceptron errou a resposta), modifique todas as conexões iw de
acordo com ii xxdw ×=∆ )(
• Volta ao passo 2 até o fim do conjunto de treinamento
Adicionalmente, precisamos ajustar o termo de viés θ . O valor de θ é considerado como
uma conexão 0w entre o nó de saída e uma unidade que tem sempre valor de saída 1x0 = .
Assim, este valor deve ser modificado de acordo com a mesma regra de treinamento:
Para a regra de treinamento do Perceptron existe um teorema da convergência, que afirma
o seguinte:
Teorema 1: Se existe um conjunto de pesos de conexão w* capaz de realizar a
transformação )(xdy = , a regra de treinamento do perceptron irá convergir para
alguma solução (que pode ser ou não a mesma que w*) num número finito de passos
para qualquer conjunto inicial de pesos.
23
Rosenblatt (apud Kröse & Smagt, 1996, p.26) demonstrou a prova deste teorema em 1959,
o que criou uma onda de otimismo e interesse no início dos anos sessenta. Essa euforia durou
apenas até a publicação de Perceptrons em 1969, onde Minsky e Papert provaram as severas
restrições no que os perceptrons são capazes de representar.
2.3.2 Adaline (adaptative linear element)
Uma generalização importante do algoritmo de treinamento do perceceptron foi
apresentada por Widrow e Hoff com o nome de LMS (“least mean square”) também
conhecida como regra delta. A grande diferença em relação à regra do perceptron está na
forma como a saída é usada na lei de aprendizado. O perceptron usa a saída da função de
ativação para aprender (ou 1 ou -1). A regra delta usa a entrada total da unidade, ou seja, sem
mapear para os valores -1 ou 1.
A regra delta foi aplicada ao Adaline desenvolvido por Widrow. Numa implementação
física simples, este dispositivo consistia de um conjunto de resistores reguláveis conectados a
um circuito que somava as correntes causadas pelas tensões de entrada. Este bloco somador
era seguido por um quantizador cuja saída era +1 ou -1 dependendo da polaridade da soma.
Figura 2.5 Implementação física do Adaline
24
Considerando o esquema da figura, sendo as resistências de entrada denotadas por iw ,
n...,1,0i = , o sinal de entrada por ix e a saída y , então a saída no bloco somador é
onde 0w≡θ . A regra delta de Widrow tenta ajustar os pesos iw iterativamente de modo que
a média dos quadrados dos erros em relação a y seja minimizada. Aplicando a função de
limiar a y temos a saída do Adaline.
Imaginemos agora uma rede como a anterior, porém com uma função de ativação linear.
Uma rede tão simples é capaz de representar uma relação linear entre o valor da unidade de
saída e os valores da unidade de entrada. No caso de duas unidades de entrada, o espaço de
entrada será um plano. Se existirem mais do que duas entradas, a rede representará um
hiperplano (Tafner, 1996) e é claro que múltiplas unidades de saída também podem ser
definidas.
Suponha que precisamos treinar uma rede de tal forma que um hiperplano seja dividido
tão bem quanto possível para um dado conjunto de padrões de treinamento formado por
valores de entrada px e valores de saída desejadas pd . Para cada padrão de treinamento, a
saída da rede difere do valor desejado pd em ( )pp yd − , onde py é a saída da rede para o
padrão de treinamento atual. A regra delta aplica uma função de erro baseada nessas
diferenças para ajustar os pesos.
A função de erro, como indicado pelo nome do método least mean square, é a soma dos
quadrados dos erros. O erro total é definido como:
onde o índice p varia dentro do conjunto dos padrões de treinamento e pE representa o erro
para o padrão p . O algoritmo LMS busca um conjunto de pesos que minimize a função de
25
erro por um método chamado gradiente descendente. O princípio é fazer o ajuste do peso
proporcional ao valor da derivada parcial do erro com relação a cada peso:
onde γ é uma constante de proporcionalidade. A derivada é
Simplificando por causa da função de ativação linear:
e
logo
onde ppp yd −=δ é a diferença entre a saída desejada e atual para o padrão p .
2.3.3 Problemas linearmente não-separáveis
Como já mencionado, Minsky e Papert provaram severas restrições no poder de
representação das redes perceptron. Eles demonstraram que um perceptron de camada única
não poderia representar uma simples função lógica XOR.
Tabela 1 Tabela verdade do ou-exclusivo
0x 1x d
-1 -1 -1 -1 1 1
1 -1 1
1 1 -1
Numa rede com duas entradas e uma saída, a entrada da rede equivale a:
Consideremos a função de limiar:
26
Então a saída do perceptron será definida por uma linha que divide o plano em duas
regiões. Para um valor fixo de θ , a saída do perceptron será igual a “um” de um lado da reta
definida por:
e igual a “zero” do outro lado da reta.
Figura 2.6 Representação geométrica do espaço das entradas
Como podemos ver na figura 2.6 os dois pontos em (1,-1) e (-1,1) não podem ser
separados dos pontos (-1,-1) e (1,1) por uma linha reta. Minsky e Papert provaram que para
entradas binárias, qualquer transformação pode ser realizada adicionando uma camada
escondida conectada a todas as entradas.
Figura 2.7 Solução da função XOR. Adaptado de Kröse & Smagt (1996)
27
Os valores de pesos (ao lado de cada linha) e de limiar (dentro do círculo) indicados na
figura 2.7a são um exemplo de solução da função XOR. O espaço das entradas agora possui
três dimensões, definidas pelas duas entradas da rede mais a saída da unidade escondida.
Como mostra a figura 2.7b, a rede agora representa um plano que separa o espaço das
entradas, e a distinção nos dois grupos desejados passa a ser possível.
Minsky e Papert mostraram que a adição de unidades escondidas aumenta a classe de
problemas solucionada pelas redes feed-forward do tipo perceptron. Entretanto uma solução
para o problema de como ajustar os pesos entre as entradas e unidades escondidas só foi
apresentada bem mais tarde.
2.3.4 O Perceptron multicamadas
A solução para o problema do ajuste dos pesos em redes feed-forward multicamadas foi
apresentada por Rumelhart, Hinton e William em 1986 (apud Kröse & Smagt, 1996, p.33), e
soluções similares parecem ter sido publicadas antes, como a apresentada por Werbos em
1974 em sua tese de doutorado “Beyond Regression: New Tools for Prediction and Analysis
in the Behavioral Sciences”.
A idéia central da solução é que os erros nas unidades da camada escondida são
determinados pela retro-propagação dos erros nas unidades da camada de saída, motivo pelo
qual este método recebe o nome de back-propagation. O algoritmo back-propagation também
pode ser considerado como uma generalização da regra delta para funções de ativação não-
lineares e redes multicamadas.
Durante a fase de treinamento, os padrões do conjunto de treinamento são apresentados à
rede em uma ordem qualquer. Quando um padrão de treinamento é aplicado, os valores de
ativação são propagados, camada após camada, em direção às unidades de saída, e a saída
calculada pela rede é então comparada com a saída desejada. Temos então um valor de erro
28
para cada unidade de saída, que chamaremos de 0e para uma determinada unidade de saída o .
O objetivo é fazer com que 0e se aproxime de zero.
Figura 2.8 Rede MLP e a retro-propagação dos erros (Patterson, 1995)
A maneira mais simples de conseguir minimizar 0e é ajustando os pesos de forma que
numa próxima iteração, 0e seja nulo para aquele padrão de treinamento. Sabemos pela regra
delta que para reduzir o erro de uma unidade, precisamos ajustar suas conexões de entrada de
acordo com:
Isto corrige os pesos das conexões com as unidades de saída. Para corrigir os pesos da
entrada para as camadas escondidas, precisamos aplicar novamente a regra delta. Entretanto
não temos um valor de erroδ para as unidades escondidas. Isto é resolvido pela derivada das
funções em cadeia, fazendo o seguinte: distribuir o erro de uma unidade de saída o por todas
as unidades escondidas a ela conectadas, ponderado pelo peso desta conexão. Em outras
palavras, uma unidade escondida h recebe um delta de cada unidade de saída o igual ao delta
desta unidade de saída (fator de correção do peso entre a unidade escondida h e a unidade
29
escondida o ) ponderado pelo peso de conexão destas unidades. Matematicamente, o sinal de
erro hδ é hoo
oh w∑= δδ . Para que a fórmula fique correta precisamos aplicar a derivada da
função de ativação da unidade escondida, 'F . A generalização da regra delta para funções de
ativação não-lineares pode ser vista em Kröse & Smagt (1996, p34-35). Com a função de
ativação sigmóide, temos o seguinte:
)y1(y)yd( ooooo −−=δ
hoo
ohhh w)y1(y ∑−= δδ
O ajuste de cada peso de conexão da rede, para um padrão de treinamento p pode ser
calculado por:
pj
pkjkp yw γδ=∆
Kröse & Smagt (1996, p.37) fazem uma observação importante a respeito do treinamento
por padrões:
Embora, teoricamente, o algoritmo back-propagation aplique o gradiente
descendente no erro total somente se os pesos forem ajustados após a apresentação
de todo o conjunto de padrões, ou seja, não é aplicada a regra de aprendizado para
cada padrão separadamente, existe uma indicação empírica de que isto resultaria
numa convergência mais rápida. No entanto, temos que tomar cuidado com a ordem
em que os padrões são apresentados. Por exemplo, quando usamos a mesma
seqüência durante todas as épocas do treinamento a rede acaba se focando nos
primeiros padrões. Este problema pode ser evitado usando um método de
treinamento com permutação.
30
3 PROCESSAMENTO DIGITAL DE SINAIS
3.1 Transformada de Fourier
A transformada de Fourier, batizada em homenagem a Jean-Baptist Joseph Fourier, é uma
transformada integral que expressa uma função em termos de funções de base senoidal, ou
seja, como soma ou integral de funções senoidais multiplicadas por coeficientes
(“amplitudes”).
Geralmente, a denominação “Transformada de Fourier” refere-se à esta transformada para
funções contínuas, que representa qualquer função integrável )t(f como a soma de
exponenciais complexas com freqüência angular w e amplitude complexa )w(F :
dtetfwF iwt
∫∞
∞−
−⋅= )()(
Entretanto, para processamento digital de sinais, é preciso ter valores )n(x discretos,
resultantes do processo de amostragem3 do sinal contínuo. Neste caso usa-se a versão da
transformada para funções discretas:
,)(1
)(1
0
2
∑−
=
−⋅=
N
n
Nmni
enxN
mfπ
1,...,0 −= Nm
A transformada discreta de Fourier (DFT4) nos retorna um conjunto de m valores no
domínio da freqüência a partir de n amostras no domínio do tempo:
3 amostragem é o processo de discretização temporal de um sinal contínuo 4 Discrete Fourier Transform
31
Figura 3.1 Amostragem em função do tempo e seu espectro (Dovicchi 1999)
Algumas observações importantes:
• Considerando o período de amostragem T em segundos, a freqüência de amostragem
será Tf a /1= em Hertz. Os valores |)(| mx resultantes da DFT representam as
freqüências do espectro do sinal, variando entre zero e 2/af , em incrementos de
NfF a /= .
• De acordo com o teorema de Niquist (apud Dovicchi 1999) para se evitar a
sobreposição espectral, a taxa de amostragem af deve ser maior ou igual ao dobro da
maior freqüência presente no sinal, ou seja, se a maior freqüência for mf , o intervalo
de amostragem deve satisfazer: mf
T⋅
<2
1
• Apenas 2/N componentes espectrais complexos são significativos, acima de
2/N temos os componentes espectrais complexos negativos, que em módulo são uma
cópia espelhada dos valores abaixo de 2/N
32
Um método largamente utilizado para o cálculo computacional da DFT é o algoritmo FFT
(Fast Fourier Transform) cuja complexidade, para N amostras, é da ordem de
))N(logN(O 2⋅ operações contra )N(O 2 operações para o cálculo pela definição. Este
método foi demonstrado por Cooley & Tukey em 1965 (apud Dovicchi 1999 p.14).
A determinação de cada componente espectral da DFT pode ser entendida como uma
convolução entre as amostras no tempo e a função de base senoidal )m(X que completa m
períodos dentro do intervalo NTtp ⋅= . Assim, as partes real e imaginária de cada
componente de freqüência )(mX é:
∑−
=
⋅=1
0
)/2cos()()}(Re{N
n
NmnnxmX π
∑−
=
⋅−=1
0
)/2()()}(Im{N
n
NmnsennxmX π
Esta notação é também conhecida como notação retangular. A amplitude complexa pode
ser obtida por:
22 })(Im{)}(Re{)}({ mXmXmXMag +=
E a fase por:
=
)}(Re{
)}(Im{)}({
mX
mXarctgmXFase
Figura 3.2 Representação polar versus retangular
33
3.2 Short-Time Fourier Transform (STFT)
A DFT nos fornece uma representação global do sinal em termos de seus componentes de
freqüência. No entanto podemos estar interessados no conteúdo local de freqüências, ou seja,
que características espectrais o sinal possui nas redondezas de um determinado instante de
tempo. Um meio de conseguir com que as informações estejam localizadas em ambos os
domínios, tempo e freqüência, é aplicarmos a STFT, também chamada de Transformada de
Fourier Janelada.
A STFT é definida por (Schniter, 2005):
dteutgtfuF ti
∫∞
∞−
−⋅−⋅= ξξ )()(),(
A STFT pode ser interpretada como a Transformada de Fourier de uma janela deslizante:
para calcular )u,(F ξ , desloque o centro da janela )t(g para o instante u , aplique a janela ao
sinal de entrada e então calcule a FT do resultado.
Figura 3.3 Janelamento do sinal
A idéia é isolar o sinal nas vizinhanças do instante u , então aplicar a Transformada de
Fourier afim de estimar o conteúdo “local” de freqüência no instante u .
Essencialmente, a STFT usa elementos base tiu e)ut(g)t(g ξ
ξ ⋅−= . Estes elementos são o
produto de uma senóide por uma janela simétrica e de energia finita )t(g . A família de
elementos base é obtida pelo deslocamento no tempo e modulação na freqüência do elemento
34
original )t(guξ . Estes átomos tem freqüência central ξ e são simétricos em relação a u
(Chaplais, 1999), como mostra a figura 3.4:
Figura 3.4 Elementos base da STFT, adaptado de (Chaplais, 1999).
A STFT possui resolução constante no tempo e freqüência. Esta resolução pode ser
alterada redimensionando a janela )t(g . O uso de uma janela larga resulta em boa resolução
na freqüência, porém resolução baixa no tempo ao passo que o uso de uma janela estreita nos
dará uma boa resolução no tempo e baixa resolução na freqüência (Schniter, 2005).
35
Figura 3.5 Exemplo de elemento base com 10.5 períodos e janela de Hanning
Figura 3.6 Espectro do elemento base com corte abrupto (a) e janelado (b) por função de Hanning
As propriedades da STFT são determinadas pela janela escolhida e a forma como a
energia esta concentrada ao redor do seu centro. Observe as figuras 3.5 e 3.6.
O uso da função de janelamento evita a introdução de alguns fenômenos indesejados,
como o fenômeno de Gibbs (Weisstein, 2006b), causados pelo corte abrupto do sinal (caso de
uma janela uniforme ou retangular). A figura 3.7 mostra algumas das funções de janelamento
mais usadas.
u
t
t
t
f
f
ξ
36
Figura 3.7 Algumas funções de janelamento e suas transformadas cosseno5 (Weisstein, 2006a)
A transformada discreta STFT é calculada por:
,)()(),(1
0
2
∑−
=
−
⋅−⋅=N
n
Nmni
eutgnxumfπ
1,...,0 −= Nm
Para um valor fixo de u , a fórmula é a da transformada discreta de Fourier, que pode ser
computada pelo algoritmo FFT aplicado a cada janelamento do sinal original.
5 Parte real da transformada de Fourier
37
3.3 Transformada Wavelet
A análise de sinais de acordo com escalas variáveis no domínio do tempo e da freqüência
é a idéia básica da utilização da teoria das Wavelets. Wavelets são funções matemáticas que
ampliam intervalos de dados, separando-os em diferentes componentes de freqüência,
permitindo a análise de cada componente em sua escala correspondente (Dovicchi, 1999).
As funções Wavelet podem ser usadas não apenas para analisar sinais estacionários, mas
também para decompor sinais não-estacionários, variantes no tempo ou de características
transientes.
A transformada Wavelet substitui as funções base senoidais da transformada de Fourier
por uma família gerada pela translação6 e dilação7 de uma função )t(ψ chamada wavelet mãe:
,s
ut
s
1)t(u,s
−⋅= ψψ ,0s > ℜ∈u
A função anterior é centralizada ao redor de u , tal como um átomo da STFT. Se a
freqüência central de ψ é η , então a freqüência central da função resultante da dilação de ψ
é s/η . Sua distribuição no tempo é proporcional ao fator de escala s . Sua distribuição na
freqüência é inversamente proporcional a s (figura 3.7).
6 Função que toma um vetor e retorna outro vetor, múltiplo do vetor dado: vv
rrλ→ , onde λ é um escalar
qualquer e vr
um vetor de qualquer espaço vetorial. 7 Função que soma um vetor constante k a um vetor dado: vkv
rrr+→ , onde v
r e k
r são vetores de qualquer
espaço vetorial.
38
Figura 3.8 Elementos base da transformada Wavelet, adaptado de (Chaplais, 1999).
Assim, a transformada wavelet tem uma resolução no tempo e freqüência que depende do
fator de escala s de cada janela.
As Wavelets devem satisfazer certas propriedades específicas. Uma delas é a propriedade
de integrar a zero, ondulando acima e abaixo do eixo x ; outras são propriedades técnicas que
asseguram o cálculo rápido e fácil da transformada direta e inversa. Assim como senos e
cossenos são bases na análise de Fourier, as Wavelets são usadas como bases na representação
de outras funções (Wickerhauser apud (Dovicchi, 1999)).
Uma vez estabelecida uma base Wavelet )t(ψ , chamada Wavelet mãe, pode-se estabelecer
bases de translação e dilação da Wavelet mãe, tal que:
ℜ×ℜ∈
− +),(, uss
utψ
,
onde os valores de s e u devem ser selecionados convenientemente tal que: j2s −= e
j2ku −⋅= , onde k e j são inteiros. A escolha de k e j proporcionará uma base esparsa e,
39
além disso, possibilitará a análise com múltiplas resoluções no processamento de sinais
(Dovicchi, 1999). Se a escala e a translação são diádicas8 as bases Wavelet são obtidas por:
( )ktt jjkj −= 22)( 2/, ψψ
O Inteiro k representa a translação da função wavelet e o inteiro j é uma indicação da
freqüência da wavelet ou posicionamento no espectro e geralmente é referido como escala
(Reza, 1999).
Figura 3.9 Wavelet mãe 12Dψ , Wavelet com escala 1j −= e à direita com escala 2j −=
Como fica evidente na figura 3.8, escalas diferentes correspondem a diferentes espectros
de freqüência. A freqüência central de cada espectro é multiplicada ou dividida por 2 a cada
incremento ou decremento de j . Outro aspecto da transformada wavelet é que a localização
temporal (quão compacta no tempo) aumenta junto com a freqüência ou escala. Em outras
palavras, escalas maiores correspondem à localização mais precisa e vice-versa (Reza, 1999).
A análise multiresolução precisa de duas funções básicas estreitamente relacionadas. Além
da função wavelet )t(ψ , precisamos de outra função básica chamada função escalonante,
denotada por )t(ϕ . A translação e dilação de )t(ϕ é similar a de )t(ψ .
A expansão wavelet para o sinal )t(x é dada pela seguinte série de decomposição (Burrus
(apud Reza, 1999 p.3)):
)()()( ,,,
0
0tdtctx kj
k jjkjkj
kk ψϕ ∑∑∑
∞
=
+=
8 js −= 2 é chamada dilação diádica, and jku −⋅= 2 é a translação dyadica
40
Nesta expansão, os coeficientes kc são chamados de coeficientes de aproximação na
escala 0j . O conjuntos de coeficientes k,jd representam detalhes do sinal em diferentes
escalas. A transformada wavelet discreta (DWT9) consiste de ambos. Para sinais contínuos, o
limite superior para as escalas de detalhes segue para o infinito; entretanto, para sinais
discretos, ele está limitado ao detalhe máximo disponível no sinal.
A relação dos coeficientes wavelet10 com o sinal original é:
dtttxd kjkj )()( ,, ψ=
dtttxc kjk )()( ,0ϕ=
O cálculo dos coeficientes DWT é geralmente formulado em termos de um conjunto de
filtros multirate. Os coeficientes destes filtros, que geralmente são FIR11, são obtidos pelo
conhecimento da wavelet mãe e função escalonante.
A DWT de um sinal x é calculada pela passagem em série deste conjunto de filtros.
Primeiramente, o sinal passa por um filtro passa-baixa g , sendo o resultado a convolução do
sinal com o filtro:
O sinal é decomposto simultaneamente usando um filtro passa-alta h . As saídas são os
coeficientes de detalhes k,jd e coeficientes de aproximação kc (saída do filtro passa-baixa).
Entretanto, como metade das freqüências foi removida, metade dos coeficientes de saída pode
ser descartada, conforme a regra de Nyquist. As saídas dos filtros são então dimidiadas por
um fator de dois:
9 discrete wavelet transform. 10 Para wavelets ortogonais e reais. Wavelets biortogonais precisam de filtros diferentes para análise e síntese. 11 Finite Impulse Response
41
Esta decomposição diminuiu pela metade a resolução no tempo já que apenas metade dos
coeficientes de saída dos filtros caracteriza o sinal. Em compensação cada saída tem metade
da banda de freqüências da entrada, ou seja, a resolução na freqüência foi dobrada.
A decomposição é reaplicada nos coeficientes de aproximação, que passam pelos filtros
passa-alta e passa-baixa e são então dimidiados por dois (figura 3.10). Isto resultando em mais
um nível de coeficientes de detalhes e aproximação, cada qual representando metade da banda
de freqüência dos coeficientes do nível anterior. Esta operação pode ser repetida até que reste
apenas um único coeficiente de aproximação. Como a cada decomposição as saídas dos filtros
são dimidiadas por dois, o número total de coeficientes se mantém igual.
Figura 3.10 Banco de filtros de 3 níveis
Por exemplo, para um sinal com dezesseis amostras, freqüência variando entre zero e nf ,
e três níveis de decomposição, quatro escalas de saída são produzidas:
Figura 3.11 Representação da DWT no domínio das freqüências
A transformada pode ser revertida, reconstruindo os coeficientes de aproximação de um
nível anterior, a partir dos coeficientes de detalhe e aproximação de mesmo nível.
42
Kaplan (2002) mostra como calcular um espectro de potência a partir de um vetor de
coeficientes resultantes da DWT de um sinal, no exemplo, de 16 amostras:
Figura 3.12 Estrutura lógica do resultado da DWT (Kaplan, 2002)
Se o vetor consiste de N elementos, onde N é uma potência de dois, então teremos
(N)log2 bandas de coeficientes e 1 valor de aproximação. No exemplo da figura 3.11, o
resultado de uma DWT de 16 elementos tem 4 sub-bandas ( 4 (16)log2 = ). O espectro de
potências wavelet é calculado somando-se os quadrados dos coeficientes de cada sub-banda
(Kaplan, 2002):
∑−
=
=12
0k
2k,j
j
c]j[spectrum
43
4 METODOLOGIA
O problema de reconhecer palavras se subdivide em três partes: a aquisição do sinal, a
extração de características e a classificação. A aquisição envolve simplesmente a gravação e
digitalização do comando de voz. A extração envolve o processamento digital do sinal a fim
de extrair parâmetros que melhor o representem, ou seja, características necessárias e
suficientes para o seu reconhecimento. A classificação consiste em fazer uso das informações
quantizadas (padrões) na construção de um modelo capaz de reconhecer novas ocorrências de
um conjunto pré-determinado de palavras, ou simplesmente classificar um sinal apresentado
em uma destas classes.
Basicamente, os métodos de extração apresentados a seguir buscam determinar
informações de tempo-freqüência dos sinais. Estas são usadas para treinamento (formam o
conjunto de treinamento) ou reconhecimento por uma rede neural.
4.1 Aquisição dos sinais de áudio
Todas as amostras de áudio utilizadas para fins de avaliação do modelo e cujo resultados
estão contidos neste trabalho foram tomadas usando gravador digital portátil modelo: X-
MICRO Video MP3 400.
Figura 4.1 Gravador digital, a seta vermelha indica o microfone embutido
44
O aparelho amostra numa taxa de 8KHz com codificação IMA ADPCM12 de quatro bits
por amostrao. Os arquivos decodificados no computador em formato PCM13 apresentam
resolução de oito bits por amostra.
As gravações utilizadas no experimento foram tomadas em conjuntos de dez palavras,
sendo cada uma repetida seis vezes consecutivas. Foram feitas seis tomadas de gravações para
um primeiro conjunto de palavras. Mais tarde foram feitas mais seis tomadas de gravação para
dez novas palavras.
Tabela 2 Esquema de gravação das amostras de teste
Grupo Tomadas Palavra Repetições por tomada Total
amarelo 6 36
verde 6 36
azul 6 36
branco 6 36
vermelho 6 36
um 6 36
dois 6 36
três 6 36
quatro 6 36
1 6
cinco 6 36
seis 6 36
sete 6 36
oito 6 36
nove 6 36
zero 6 36
rosa 6 36
laranja 6 36
preto 6 36
marrom 6 36
2 6
roxo 6 36
TOTAL 12 20 120 720
12 Adaptative Differential Pulse Code Modulation 13 Pulse Code Modulation
45
4.2 Extração de características
Duas classes de extratores foram implementadas, uma utilizando STFT (cf. seção 3.3.1) e
outra utilizando DWT (cf. seção 3.4). Para cada palavra, o número de amostras lidas foi
fixado em 8192, pouco mais de um segundo para taxa de amostragem de 8000Hz. Fixar o
número de amostras neste valor traz uma vantagem já que as transformadas usadas exigem
que o número de amostras seja uma potência de dois.
O início do comando foi detectado a partir de uma amplitude maior que 5% da amplitude
máxima possível (nível seguramente alcançado pela pronúncia de uma vogal) e um recuo de
100ms foi aplicado (para incluir qualquer som de consoante não detectado). A mesma técnica
pode ser aplicada caso as amostras de som sejam obtidas diretamente do microfone do
computador.
4.2.1 Extração com STFT
Para estimar o conteúdo de freqüências ao longo do período de pronúncia da palavra, a
transformada FFT foi aplicada a vários frames14, cada um contendo um instante diferente de
tempo do sinal original. A janela de Hanning foi aplicada a fim de evitar fenômenos
indesejados causados pelo seccionamento abrupto do sinal. Algum grau de superposição entre
frames foi adotado (normalmente 50%).
0
0.2
0.4
0.6
0.8
1
1.2
-1
-0.9
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.4
-0.3
-0.2
-0.1 -0
0.0
6
0.1
4
0.2
2
0.3
0.3
9
0.4
7
0.5
5
0.6
3
0.7
2
0.8
0.8
8
0.9
6
Gaussian Hann Hann adjacentes Soma das Hann Blackman
Figura 4.2 Diferentes funções de janelamento
14 Fragmento do sinal original, uma janela no tempo
46
Desta forma, para cada frame temos o cálculo de um espectro de freqüências.
Figura 4.3 Espectro de freqüência de 7 frames consecutivos, em vermelho o mesmo frame
A figura 4.3 mostra o resultado para frames de 512 amostras. Neste caso, o sinal é
dividido em 32 frames, e cada espectro resultante é composto de 256 pontos no domínio da
freqüência.
Para cada espectro, algum tipo de resumo das informações das freqüências presentes
precisa ser feito. Uma primeira tentativa foi o cálculo do centróide espectral de Sandel (apud
Dovicchi, sem data p.2):
∑∑
=
=⋅
=i
1n n
i
1n nn
pI
IFC
Desta forma, no caso de 32 frames, teremos 32 valores de centróides:
Figura 4.4 Valores das centróides para (a) repetições de uma mesma palavra e (b) palavras diferente
47
A segunda maneira de resumir o conteúdo local de freqüência foi definindo sub-bandas
no espectro e calculando a soma das intensidades para cada sub-banda. A divisão em 5
regiões mostrou bons resultados.
Figura 4.5 Espectro de um frame dividido em 5 regiões
Para 32 frames, temos 160 divisões por sinal analisado, já que são 5 sub-bandas por frame.
A figura 4.6 exemplifica o processo para frames de 512 amostras:
Figura 4.6 Processo de extração
48
4.2.2 Extração com DWT
A transformada wavelet discreta oferece uma excelente ferramenta para decomposição do
sinal em seus diferentes componentes de freqüência, com a vantagem de que o resultado da
transformada permanece no domínio do tempo. Os coeficientes usados na transformada foram
os de Daubechies ordem 4 (figura 4.7). Este tipo de wavelet é usada no processamento de
fonemas devido ao seu bom comportamento na modelagem de sinais de alta freqüência e
características ruidosas (Long & Datta, 1996).
Figura 4.7 Função Wavelet e função escalonante Daub4
Uma vez que todos os sinais possuem 8192 amostras, o resultado da DWT de cada um
contem 13 bandas ( 8192213 = ). Um espectro de potência com 13 componentes de freqüência
pode ser calculado (cf. Seção 3.4). Entretanto uma representação global do sinal não traz
informação suficiente para a classificação das palavras – é preciso determinar informações de
tempo-freqüência.
Para tal, cada sub-banda é dividida em segmentos iguais (aqui chamados de sub-frames) e
o espectro de potência é calculado. Desta forma, temos uma indicação de como a energia em
cada banda variou ao longo do tempo de pronuncia da palavra. Testes preliminares mostraram
que as primeiras quatro bandas dos coeficientes de detalhes trazem praticamente toda a
informação relevante acerca do sinal. Estes coeficientes cobrem quase toda faixa do espectro
49
onde a voz humana está localizada. O primeiro passa-alta possui 4096 coeficientes e contém
teoricamente as freqüências entre 2KHz e 4Khz (maior freqüência possível), o segundo 2048
coeficientes e freqüências entre 1KHz e 2Khz, o terceiro 1024 coeficientes e freqüências entre
500Hz e 1Khz e o quarto 512 coeficientes de detalhes e as freqüências entre 250Hz e 500Hz.
Para um tamanho de frame de 64 coeficientes, a primeira sub-banda é dividida em 64
subframes, a segunda em 32 subframes, a terceira em 16 subframes e a quarta em 8, o que
resulta num total de 120 divisões para cada sinal. Cada subframe representa um bloco no
plano do tempo-freqüência (veja figura 4.10) e a parcela de potência presente nele é calculada
a partir da soma dos quadrados dos coeficientes. Observe a figura 4.8, onde cada barra
representa um subframe, e cada cor simboliza uma sub-banda diferente.
Figura 4.8 Extração: cinco repetições, mesma palavra
Figura 4.9 Extração: cinco palavras diferentes
50
Figura 4.10 Divisão do plano tempo-frequencia resultante da extração com DWT
Uma segunda maneira de proceder à divisão em frames é adotar um número fixo de
divisões, por exemplo, 32 divisões por sub-banda, o que resulta em 128 divisões por sinal
analisado. Os valores podem ser reagrupados para que fiquem na ordem do tempo e não por
banda. Assim o resultado é parecido com a análise STFT, onde se tem um resumo dos
componentes de freqüência num determinado instante (correspondente a cinco sub-bandas do
espectro de um frame).
Figura 4.11 Processo de ordenação no tempo para número fixo de frames por sub-banda
51
A primeira forma de divisão (tamanho fixo) é conceitualmente mais adequada, já que a
primeira sub-banda possui a maior resolução no tempo (e a menor resolução na frequência, ou
seja, muitos componentes misturados) e a quarta sub-banda possui a maior resolução na
freqüência dentre as avaliadas (em compensação possui a pior resolução no tempo, ou seja,
tem poucos coeficientes).
4.3 O Classificador
Para a tarefa de classificação uma rede neural foi implementada em linguagem Java.
Tentamos utilizar uma rede Multi-Layer Perceptron, mas a mesma não apresentou bom
desempenho, então partimos para uma solução que se mostrou simples e eficaz. A rede possui
camada única e aplica regra de aprendizado baseada na função de erro de Bernoulli. A função
de ativação de cada unidade é a multi-logística.
O número de saídas depende do tamanho do vocabulário da rede, ou seja, quantas palavras
ela precisa reconhecer. Cada palavra possui uma saída correspondente, e a rede é treinada
para elevar seu valor a um (1,0) quando sua entrada caracterize aquela palavra. As demais
entradas devem estar o mais próximo possível de zero. O número de entradas depende da
técnica de extração escolhida. O número de pesos é o produto das saídas pelas entradas.
Figura 4.12 Topologia do classificador
52
Os nós de entrada simbolizam simplesmente que cada entrada é conectada a todas as
unidades da rede. A regra de propagação usada foi o somatório ponderado pelos pesos. Cada
unidade de saída possui uma entrada de viés. Assim, a entrada total )t(sk de cada unidade da
rede é dada por:
O estado de ativação de cada unidade depende da função de ativação kF . Como queremos
classificar uma dada ocorrência em uma de N classes (nossa variável objetivo – qual a palavra
– é uma variável categorizada), torna-se útil que as saídas da rede variem entre zero e um, e
que todas somadas resultem em um. Assim, cada valor de saída representa uma probabilidade.
Para tal, existe a função de ativação Softmax (Sarle, 2004) também chamada de função multi-
logistica, que para N unidades de saída é definida por:
∑=
=N
1n
)t(s
)t(s
k
n
k
e
e)t(F ,
ou seja, o valor de saída é calculado dividindo-se o valor da exponencial do total de entrada
na unidade pela soma das exponenciais do total de entrada em cada uma das unidades de
saída. Esta função se reduz à função logística (sigmóide) quando temos apenas duas
categorias (ou saídas).
Como vimos na seção 2.3.4, para função de ativação sigmóide, o cálculo do erro nas
unidades de saída é:
'Fy
EP
P
o ⋅∂
∂−=δ
)yd(y
E pp
P
P
−−=∂
∂
)y1(y)yd( ooooo −−=δ
Isto de acordo com o cálculo de erro do método LMS. Entretanto, para o caso de
problemas de classificação, existe uma função de erro específica – a função de erro de
Bernoulli (Chow & Goode, 1994):
53
{ }∑ −⋅−+⋅−=j
P
j
P
j
P
j
P
j
P ydydE )1log()1()log(
assim, o termo PP y/E ∂∂ é:
p
p
p
p
P
P
y
d
)y1(
)d1(
y
E−
−
−=
∂
∂
e o cálculo do erro para função de ativação sigmoide:
)yd()y1(yy
d
)y1(
)d1( ppoop
p
p
p
o −=−⋅−−
−=δ
O uso da função de erro de Bernoulli ao invés do método LMS resulta num aumento
significativo da velocidade do treinamento (Chow & Goode, 1994).
54
5 Resultados
Um conjunto de treinamento usando seis repetições de cada palavra foi montado,
resultando em 120 padrões de treinamento. As 600 gravações restantes, ou seja, trinta
repetições de cada palavra, compuseram o conjunto do teste. O vocabulário consiste das vinte
palavras dispostas na tabela 2. O treinamento foi fixado em 500 épocas com taxa de
aprendizado de 0,25. Cada teste foi executado três vezes.
5.1 Resultado com cálculo de centróides
Tabela 3 Resultados de classificação baseados no cálculo de centróides
Número de centróides15
Acertos no conj. de
treinamento
Acertos no conj. de teste
média de acertos
taxa de acerto
118 516
120 522 16
120 523
520.3 86.72%
120 527
120 524 31
120 526
525.7 87.61%
120 524
120 524 62
120 523
523.7 87.28%
15 O tamanho do frame foi mantido fixo em 512 amostras. Variou-se a taxa de superposição entre frames
55
Curvas de aprendizado
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
1 101 201 301 401 501
época
erro
méd
io
62 centróides 31 centróides 16 centróides Figura 5.1Curvas de aprendizado baseado na extração de centróides
16 centróides
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados 64 centróides
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
32 centróides
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
32 centróides e 5000 épocas
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados Figura 5.2 Dispersão dos valores de saída da rede no o conj. de teste – extração de centróides
56
5.2 Resultados com STFT
Tabela 4 3 Resultados de classificação baseados na STFT
Número de divisões16 Acertos no
conj. de teste
Acertos no conj. de
treinamento
média de acertos
taxa de acerto
119 535
119 530 3 frames * 5 sub-bandas
120 536
533.7 88.94%
120 562
120 559 7 frames * 5 sub-bandas
120 561
560.7 93.44%
120 559
120 559 14 frames * 5 sub-bandas
120 559
559.0 93.17%
120 562
120 562 31 frames * 5 sub-bandas
120 564
562.7 93.78%
Curvas de aprendizado
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
1 101 201 301 401 501
época
erro
méd
io
155 frames 75 frames 35 frames 15 frames Figura 5.3 Curvas de aprendizado baseado na extração STFT
16 Frames com 50% de superposição e janela de Hanning
57
15 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados 75 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
35 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
155 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
Figura 5.4 Dispersão dos valores de saída da rede no conj. de teste – extração STFT
58
5.3 Resultados com DWT
Tabela 5 Resultados de classificação baseados na extração DWT
Número de divisões Acertos no
conj. de treinamento
Acertos no conj. de
teste
média de acertos
taxa de acerto
117 505
113 497 8+4+2+1 subframes
119 513
505.0 84.17%
120 561
120 563 16+8+4+2 subframes
120 565
563.0 93.83%
120 575
120 575 32+16+8+4 subframes
120 575
575.0 95.83%
120 577
120 578 64+32+16+8 subframes
120 580
578.3 96.39%
Curvas de aprendizado
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
1 101 201 301 401 501
época
erro
méd
io
120 frames 60 frames 30 frames 15 frames Figura 5.5 Curvas de aprendizado baseado na extração DWT
59
15 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados 60 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
30 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
120 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados Figura 5.6 Gráfico de dispersão dos valores de saída da rede no conj. de teste – extração DWT
60
5.4 Resultados com DWT (método B)
Tabela 6 Resultados de classificação baseados na extração DWT (método B)
Número de divisões Acertos no
conj. de treinamento
Acertos no conj. de teste
média de acertos
taxa de acerto
117 522
117 514 4 sub-bandas * 4 subframes
114 494
510.0 85.00%
120 553
120 557 4 sub-bandas * 8 subframes
120 556
555.3 92.56%
120 565
120 565 4 sub-bandas * 16 subframes
120 566
565.3 94.22%
120 572
120 569 4 sub-bandas * 32 subframes
120 572
571.0 95.17%
Curvas de aprendizado
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
0.2
1 101 201 301 401 501
época
erro
méd
io
128 frames 64 frames 32 frames 16 frames Figura 5.7Curvas de aprendizado baseado na extração DWT (método B)
61
16 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados 64 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
32 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
128 frames
0
0.2
0.4
0.6
0.8
1
1.2
0 50 100 150 200 250 300 350 400 450 500 550 600
contagem
valo
r d
e sa
ída
da
red
e
corretamente classificados incorretamente classificados
Figura 5.8 Gráfico de dispersão dos valores de saída da rede no conj. de teste – extração DWT (método B)
62
5.5 Comparativo entre métodos de extração
Median
25%-75%
Non-Outlier Range
Outliers
Extremes
ST
FT
(co
rre
tos)
ST
FT
(in
co
rre
tos)
Wa
ve
let (c
orr
eto
s)
Wa
ve
let (i
nco
rre
tos)
Wa
ve
let B
(co
rre
tos)
Wa
ve
let B
(in
co
rre
tos)
-0,2
0,0
0,2
0,4
0,6
0,8
1,0
1,2
Figura 5.9 Valores de saída da rede no conjunto de teste – extração com muitas divisões
Tabela 7 Estatísticas dos valores de saída da rede no conjunto de teste – extração com muitas divisões
STFT
155 divisões DWT
120 divisões DWT método B
128 divisões
corretos incorretos corretos incorretos corretos incorretos
média 0.962 0.211 0.951 0.178 0.950 0.202
mediana 0.993 0.174 0.988 0.096 0.990 0.235
N 562 38 578 22 572 28
mínimo 0.480 0.001 0.445 0.000 0.415 0.000
máximo 1.000 0.490 1.000 0.424 1.000 0.455
Percentil 25% 0.968 0.055 0.952 0.027 0.956 0.055
Percentil 75% 0.999 0.388 0.997 0.373 0.998 0.339
63
Median
25%-75%
Non-Outlier Range
Outliers
Extremes
Ce
ntr
óid
e (
co
rre
tos)
Ce
ntr
óid
e (
inco
rre
tos)
ST
FT
(co
rre
tos)
ST
FT
(in
co
rre
tos)
Wa
ve
let (c
orr
eto
s)
Wa
ve
let (i
nco
rre
tos)
Wa
ve
let2
(co
rre
tos)
Wa
ve
let2
(in
co
rre
tos)
-0,2
0,0
0,2
0,4
0,6
0,8
1,0
1,2
Figura 5.10 Valores de saída da rede no conj. de teste – extração com poucas divisões
Tabela 8 Estatísticas dos valores de saída da rede no conj. de teste – extração com poucas divisões
31 centróides STFT
35 divisões DWT
30 divisões DWT método B
32 divisões
corretos incorretos corretos incorretos corretos incorretos corretos incorretos
média 0.883 0.171 0.947 0.216 0.898 0.195 0.899 0.198
mediana 0.955 0.168 0.987 0.216 0.954 0.191 0.962 0.156
desvio padrão 0.162 0.122 0.101 0.148 0.131 0.145 0.136 0.153
N 527 73 559 41 563 37 556 44
min. 0.251 0.000 0.424 0.003 0.321 0.001 0.316 0.001
max. 1.000 0.447 1.000 0.435 1.000 0.477 1.000 0.484
Percentil 25% 0.848 0.075 0.957 0.070 0.864 0.035 0.854 0.070
Percentil 75% 0.990 0.231 0.997 0.359 0.988 0.276 0.993 0.335
64
5.6 O Supertreinamento
Curvas de aprendizado
0
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
0.0007
0.0008
0.0009
0.001
1 2001 4001 6001 8001
época
erro
méd
io
Wavelet STFT Figura 5.11 Curvas de aprendizado para 10000 épocas
Median
25%-75%
Non-Outlier Range
Outliers
Extremes
co
rre
tos (
10
00
0 é
po
ca
s)
inco
rre
tos
co
rre
tos (
50
0 é
po
ca
s)
inco
rre
tos
-0,2
0,0
0,2
0,4
0,6
0,8
1,0
1,2
Figura 5.12 Valores de saída da rede no conj. de teste – diferentes números de épocas
65
Tabela 9 Estatísticas dos valores de saída da rede no conj. de teste – diferentes números de épocas
10000 épocas 500 épocas
corretos incorretos corretos incorretos
média 0.980 0.133 0.962 0.211
mediana 1.000 0.059 0.993 0.174
N 565 36 562 38
mínimo 0.483 0.000 0.480 0.001
máximo 1.000 0.466 1.000 0.490
Percentil 25% 0.995 0.008 0.968 0.055
Percentil 75% 1.000 0.238 0.999 0.388
66
5.7 Resultados utilizando software de terceiros
Os dados resultantes da extração também foram exportados para arquivo de texto. Assim,
puderam ser importados no software de estatística SAS 8.2. O SAS Enterprise Miner traz
como ferramenta as redes neurais. O programa permite configurações na topologia da rede,
possibilitando a escolha de uma rede semelhante à implementada (sem camada escondida).
O mesmo tipo de conjunto de treinamento foi usado (amostra estratificada, 6 repetições
por palavra). Um conjunto de validação de mesmo tamanho (120 gravações) foi usado. O erro
no conjunto de validação não entra no ajuste dos pesos, serve apenas para podermos detectar
supertreinamento da rede. O restante das amostras (480 gravações) compôs o conjunto de
teste. A técnica de treinamento selecionada foi “standard backpropagation”, exceto nos casos
da extração das centróides e extração STFT de 35 divisões, onde melhores resultados foram
obtidos com método de treinamento com taxa incremental (“incremental backpropagation”).
A tabela 10 mostra os resultados de classificação usando os métodos de extração descritos
anteriormente. Cada teste foi repetido três vezes com sorteio estratificado randômico do
conjunto de treinamento.
Tabela 10 Resultados utilizando algoritmos de redes neurais do SAS
Método de extração
Erro médio no conj. de
teste
Acertos no conj. de
treinamento
Acertos no conj. de
validação
Acertos no conj. de
teste
média de acertos
taxa de acerto
0.046 120 118 427
0.050 120 120 424 31 centróides 0.050 120 120 408
419.7 87.43%
0.014 120 119 463
0.023 120 114 455 STFT
(35 divisões) 0.023 120 114 459
459.0 95.63%
0.044 119 117 459
0.023 120 116 471 STFT
(155 divisões) 0.027 120 117 469
466.3 97.15%
0.050 119 119 446
0.047 118 118 438 DWT
(120 divisões) 0.048 120 120 445
443.0 92.29%
0.043 120 120 440
0.058 118 118 452 DWT método B (128 divisões)
0.036 120 120 459
450.3 93.82%
67
Figura 5.13 Curvas de treinamento com extração DWT
Figura 5.14 Curvas de treinamento com extração DWT método B
Figura 5.15 Curvas de treinamento com extração STFT de 155 divisões
Figura 5.16 Curvas de treinamento com extração STFT de 35 divisões
68
Figura 5.17 Curvas de treinamento com extração de 31 centróides
5.7.1 Multi Layer Perceptron
Tabela 11 Resultados com rede MLP
Método de extração Nós na camada escondida
Total de conexões
Média de acertos
STFT (35 divisões) 3 184 35.00%
STFT (35 divisões) 5 294 78.13%
STFT (35 divisões) 10 569 92.50%
STFT (35 divisões) 25 1394 93.13%
STFT (35 divisões) 70 3869 95.63%
69
Figura 5.18 Curva de aprendizado do MLP com 3 nós na camada escondida
Figura 5.19 Curva de aprendizado do MLP com 70 nós na camada escondida
70
6 Conclusões
Duas técnicas para análise do sinal de voz foram abordadas neste trabalho: uma que faz a
decomposição em funções de base senoidais e pressupõe que o sinal de voz é estacionário – o
que não é bem verdade (Long, 1996); outra que faz a decomposição em funções de base com
energia finita no tempo (Wavelets) sendo mais precisa na representação de características
transientes.
Os resultados obtidos não indicam superioridade absoluta de alguma das duas técnicas.
Enquanto o melhor resultado obtido pela rede neural artificial implementada foi usando a
transformada Wavelet durante a extração de características (acerto de 96,39%), o melhor
resultado apresentado pelos algorítmos de redes neurais do SAS foi usando STFT na fase de
extração (acerto de 97,15%).
Quanto à topologia da rede neural, conclui-se que o uso de uma rede multi-camadas não é
interessante para este problema. Os resultados mostram (seção 5.7.1) que são necessários
muitos nós na camada escondida (conseqüentemente muitos pesos e muito processamento
gasto da retropropagação dos erros) para se obter o poder de representação alcançado pelas
redes de camada única.
A função de ativação usada, multi-logística, foi responsável tanto por um aumento na taxa
de classificação correta da rede (já que interfere no processo de ajuste dos pesos) como na
precisão dos valores de saída (erro médio muito menor). Tal nível de precisão permite que se
adote um critério para decidir quando a rede foi ou não capaz de identificar a palavra com um
nível de confiança adequado. Observe na tabela 9 como a intersecção entre os valores de saída
para os casos em que a rede classificou corretamente e incorretamente ou é muito pequena ou
sequer existe.
71
Outra vantagem da rede conforme implementada é que não ocorre o supertreinamento,
como nas redes MLP. Observe a seção 5.6 onde os resultados são mostrados para um
treinamento de dez mil épocas. Quanto mais épocas, mais a rede reduz seu erro médio para o
conjunto de treinamento, e mais precisa se torna ao aplicarmos o conjunto de teste (novas
ocorrências). Quanto à regra de aprendizado, a função de erro de Bernoulli se mostrou uma
forma mais adequada de corrigir os pesos. Apesar de não abordarmos nos resultados, o
método LMS e função de ativação linear (regra delta) leva muito mais épocas para convergir a
um resultado satisfatório (e sem a mesma precisão), necessitando que se utilize uma taxa de
treinamento dezenas de vezes menor.
Ainda quanto aos métodos de extração, observou-se que a extração STFT com definição
de cinco sub-bandas foi superior ao cálculo da centróide do espectro de cada frame. Com a
transformada Wavelet, dos dois métodos de divisão das sub-bandas de coeficientes de detalhe,
o primeiro (numéro fixo de coeficientes) foi ligeiramente superior em todos os testes
realizados com a rede neural implementada. No teste realizado com o SAS, o segundo método
foi ligeiramente superior (93,82% de acertos), porém não atingiu o mesmo nível da rede
neural implementada.
A utilização de redes neurais no reconhecimento de palavras isoladas se mostrou não só
possível como extremamente eficaz. Um dos temas a se trabalhar futuramente é o teste com
coeficientes Wavelet que possam ser mais adequados para modelagem da voz,
especificamente sons vocálicos, que apresentam algum nível de periodicidade. Outra
possibilidade é o uso da rede neural para o reconhecimento de fonemas de forma
independente de locutor.
72
REFERÊNCIAS
Barone, D. A. "Projeto Revox". Universidade de Caxias do Sul. Centro de Ciências Exatas e
Tecnologia, 1999. <http://ccet.ucs.br/pesquisa/projetos/revox/> acessado em 8 jul. 2006 Brierley, P. “Back Propagation Weight Update Rule”. Sem data.
<http://www.philbrierley.com/code/bpproof.html>. Acesso em 8 jul. 2006. Chaplais, F. “A WAVELET TOUR OF SIGNAL PROCESSING BY STÉPHANE
MALLAT. Academic Press, 1998. A SHORT PRESENTATION BY F. CHAPLAIS”. February 2, 1999. <http://cas.ensmp.fr/~chaplais/Wavetour_presentation/Wavetour_presentation_US.html>. Acessado em 13 jul. 2006.
Chow, M. & Goode, P. “Bernoulli Error Measure Approach to Train Feedforward
Artificial Neural Networks for Classification Problems”. 0-7803-1901-X/94 IEEE 1994. pp.44-49.
Cook, P.R. Tzanetakis, G. Essl, G. “Audio Analysis using the Discrete Wavelet
Transform”, In Cook, P.R. “Audio Analysis using the Discrete Wavelet Transform”, In Proc. WSES Int. Conf. Acoustics. <www.cs.princeton.edu/~gessl/CV-online.pdf>
Dovicchi, J. C. L. e Alves, J. B. M. “Functional Programming as a Natural Choice for
Spectral Centroid Analysis in Digital Signal Processing (DSP)” Enviado ao Journal of Functional Programming. http://turing.rexlab.ufsc.br/page/papers-jcd/centroide-jfp.ps. Acesso em 8 jul. 2006.
Dovicchi, J. C. L. “Novos Coeficientes Wavelets Baseados em Intervalos Musicais para a
Análise de Timbres de Instrumentos Acústicos”, Tese apresentada para obtenção de título de Doutor em Engenharia Elétrica, Universidade Federal de Uberlândia, Uberlândia, MG, Brasil, 171 pp., 1999. Disponível em: http://turing.rexlab.ufsc.br/page/papers-jcd/douttese.ps. Acesso em 8 jul. 2006.
Dovicchi, J. C. L. Carrijo, G. Lima, L. "Short Time Fourier Transforms And Wavelets: A
Combined Technique For Musical Signal Analysis" In: Conference on Mathematical and Computational Methods in Music, 1999, Viena, Diderot´99. Viena - Austria: , 1999. < http://turing.rexlab.ufsc.br/page/papers-jcd/fft-wav.ps>
Goya, D. H. “Tecnologia do Reconhecimento de Voz”. Revista PCWord. Acessado em set.
2002. http://pcworld.uol.com.br/pcw/testes/index_categoria?categ=tecno_hard Hebb, D. O. 1988. The organization of behavior. In Neurocomputing: Foundations of
Research, J. A. Anderson and E. Rosenfeld, Eds. MIT Press, Cambridge, MA, 43-54.
73
IBM. “IBM Home Page Reader 3.04”. 2006a. Acessado em jun. 2006. <http://www-3.ibm.com/able/solution_offerings/hpr.html>
IBM. “Embedded ViaVoice, Enterprise Edition”. 2006b. Acessado em jun. 2006.
<http://www-306.ibm.com/software/pervasive/embedded_viavoice_enterprise/about/> Ynoguti, C. A. "Transformada Discreta de Fourier". Instituto Nacional de
Telecomunicações. Santa Rita do Sapucaí - Minas Gerais - Brasil. Set. 2004 <http://www.inatel.br/docentes/ynoguti/e724/DFT.pdf>
Kaplan, I “Spectral Analysis and Filtering with the Wavelet Transform”. August 2002.
http://www.bearcave.com/misl/misl_tech/wavelets/freq/index.html. Acessado em 16 jul. 2006.
Kovács, Z. L. Redes Neurais Artificiais: Fundamentos e Aplicações. Segunda Edição,
Collegium Cognitio, 1996. Kröse, B., & Smagt, P. “An Introduction to Neural Networks”. Oitava edição, Universidade
de Amsterdã, 1996. http://www.gmd.de/ftp/div/documents/neuroprose/neuro-intro.ps.gz Lima, P. C. "Wavelets: uma introdução". Departamento de Matemática - ICEX - UFMG.
Matemática Universitária, Nº33 (2002) , 13-44. <http://www.mat.ufmg.br/%7Elima/artigos/rmu33.pdf>
Long, C.J. & Datta, S. “Wavelet Based Feature Extraction for Phoneme Recognition”.
PROC. ICSLP 1996, pp. 264-267. http://www.asel.udel.edu/icslp/cdrom/vol1/239/a239.pdf
McCulloch, W. S. & Pitts, W. 1988. “A logical calculus of the ideas immanent in nervous
activity”. In Neurocomputing: Foundations of Research, J. A. Anderson and E. Rosenfeld, Eds. MIT Press, Cambridge, MA, 15-27.
Minsky, M. & Papert, S. 1988. “Perceptrons”. In Neurocomputing: Foundations of Research,
J. A. Anderson and E. Rosenfeld, Eds. MIT Press, Cambridge, MA, 157-169. Nascimento, C. L. Artificial Neural Networks in Control and Optimization. Doctor Thesis.
University of Manchester. Manchester, 1994. Parreira, W. D. "Reconhecimento de Locutor pela Voz usando o Classificador Polinomial
e Quantizaçãoo Vetorial". Dissertação de mestrado. Faculdade de Engenharia Elétrica, UFU, 38400-902, Uberlândia, MG, abr. 2005.
Patterson, D. W. “Artificial Neural Networks: Theory and Applications”. Prentice Hall,
1995. Reza, A. M. “Wavelet Characteristics.What Wavelet Should I use?”. Oct. 19, 1999.
WHITE PAPER, Spire Lab, UWM. <http://www.xilinx.com/products/logicore/dsp/wavlet_char.pdf>
74
Sarle, W. “What is a softmax activation function?”. Jun. 2004 <http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-12.html>
Schniter, P. “Short-time Fourier Transform”. Version 2.13: 2005/10/05 15:21:14.374
GMT-5 Connexions module: m10417. Creative Commons. <http://cnx.rice.edu/content/m10417/latest/>
Schubert, E. Wolfe, J. Tarnopolsky, "A. Spectral centroid and timbre in complex, multiple
instrumental textures". University of New South Wales, Sydney, Australia. Ago. 2004. ISBN 1-876346-50-7 2004 ICMP. <http://www.phys.unsw.edu.au/~jw/reprints/SchWolTarICMPC8.pdf>
Silva, E. L. & Menezes, E. M. "Metodologia da Pesquisa e Elaboração de Dissertação". 3a
edição revisada e atualizada”. Universidade Federal de Santa Catarina. Programa de Pós-Graduação em Engenharia de Produção. Laboratório de Ensino a Distância. Florianópolis. 2001.
Torrence, C. & Compo, G. P. "A Practical Guide to nWavelet Analysis". Program in
Atmospheric and Oceanic Sciences, University of Colorado, Boulder, Colorado. 1998. <http://www.ma.utexas.edu/users/davis/reu/ch1/signals/torrence.pdf>
Traube, C. "Instrumental and vocal timbre perception". May 24, 2006 - Musicology
Department - University of Graz Psychology of Music Performance Seminar. <http://www-gewi.uni-graz.at/staff/parncutt/guests/2006/traube/ Slides_CTraube_timbre.pdf>
Tafner, M. A. Reconhecimento de palavras isoladas usando redes neurais artificiais.
Dissertação de mestrado. Programa de Pós-Graduação em Engenharia da Produção. Universidade Federal de Santa Catarina. Florianópolis, 1996.
Widrow, B. and Hoff, M. E. 1988. “Adaptive switching circuits”. In Neurocomputing:
Foundations of Research, J. A. Anderson and E. Rosenfeld, Eds. MIT Press, Cambridge, MA, 123-134.
Weisstein, E. W. "Apodization Function." From MathWorld--A Wolfram Web Resource.
2006a. <http://mathworld.wolfram.com/ApodizationFunction.html>. Acessado em 13 jul. 2006.
Weisstein, E. W. "Gibbs Phenomenon." From MathWorld--A Wolfram Web Resource.
2006b. <http://mathworld.wolfram.com/GibbsPhenomenon.html>. Acessado em 13 jul. 2006.
Zanchettin, C. & Ludermir, T. B. "Sistemas Neurais Híbridos para Reconhecimento de
padrões em Narizes Artificiais". XXV Congresso da Sociedade Brasileira da Computação. UNISINOS - São Leopoldo/RS. jul. 2005. <http://bibliotecadigital.sbc.org.br/download.php?paper=102>
75
Outras referências (sem autor): Wikipédia contributors. “Rede Neural”. Wikipédia, The Free Encyclopedia, 2006. Disponível
em: http://pt.wikipedia.org/wiki/Redes_neurais. Acesso em 8 jul. 2006. Wikipedia contributors. “Harmonic Series”, Wikipedia, The Free Encyclopedia, Jul. 2005,
<http://en.wikipedia.org/wiki/Harmonic_series_%28music%29> Acesso em 8 jul. 2006. Wikipedia contributors. “Fundamental Frequency”, Wikipedia, The Free Encyclopedia, Jul.
2005, <http://en.wikipedia.org/wiki/Fundamental_frequency> Acesso em 8 jul. 2006. Wikipedia contributors. “Continuous Fourier transform”, Wikipedia, The Free
Encyclopedia, Jul. 2005, <http://en.wikipedia.org/wiki/Continuous_Fourier_transform> Acesso em 8 jul. 2006.
Wikipedia contributors. “Fourier series”, Wikipedia, The Free Encyclopedia, Jul. 2005,
<http://en.wikipedia.org/wiki/Fourier_series> Acesso em 8 jul. 2006. Wikipedia contributors. “Discrete wavelet transform”, Wikipedia, The Free Encyclopedia,
Jul. 2005, <http://en.wikipedia.org/wiki/Discrete_wavelet_transform> Acesso em 8 jul. 2006.
Wikipedia contributors. “Fast wavelet transform”, Wikipedia, The Free Encyclopedia, Jul.
2005, <http://en.wikipedia.org/wiki/Fast_wavelet_transform> Acesso em 8 jul. 2006. Wikipedia contributors. “Daubechies wavelet”, Wikipedia, The Free Encyclopedia, Jul. 2005,
<http://en.wikipedia.org/wiki/Daubechies_wavelet> Acesso em 8 jul. 2006. Wikipedia contributors. “Derivative”, Wikipedia, The Free Encyclopedia, Jul. 2005, <
http://en.wikipedia.org/wiki/Derivative> Acesso em 8 jul. 2006. Wikipedia contributors. “Chain rule”, Wikipedia, The Free Encyclopedia, Jul. 2005,
<http://en.wikipedia.org/wiki/Chain_rule> Acesso em 8 jul. 2006.
76
APÊNDICE A – Código fonte da rede neural usada nos experimentos
RedeNeural.java Created with JBuilder package neural;
import java.io.*;
import java.text.*;
import java.util.*;
import DSP.*;
public class RedeNeural{
String[] palavras = {"seis","sete","oito","nove","zero","rosa",
"laranja","preto","marrom","roxo","amarelo",
"verde","azul","branco","vermelho","um","dois",
"tres","quatro","cinco"};
int numEpochs = 500;
int numInputs = 30;
int numOutputs = 20;
int numPatterns = 720;
private boolean softmax=true;
double LR = 0.25;
double Error;
int patNum;
double errThisPat[] = new double[numOutputs];
public double outPred[] = new double[numOutputs];
public double[][] trainInputs = new double[numPatterns][numInputs];
public double[][] trainOutput = new double[numPatterns][numOutputs];
public double[][] weights = new double[numInputs+1][numOutputs]; //+1 bias
Extrator extrator = new ExtratorWavelet();
public RedeNeural() {
PrintStream treinamento = null;
try {
treinamento = new PrintStream(new FileOutputStream("treinamento.txt"));
}
catch (FileNotFoundException ex) {
}
initWeights();
initData();
Random random = new Random();
for(int j = 0;j <= numEpochs;j++){
for(int i = 0;i<numPatterns;i++){
patNum = random.nextInt(numPatterns);
calcNet();
WeightChanges();
77
}
calcOverallError();
System.out.println("epoch = " + j + " Error = " + Error);
treinamento.println(Error);
}
displayResults();
}
public String Predict(double[] Input){
trainInputs[0] = extrator.PowerSpectrum3(Input);
for (int j=0; j<numInputs; j++){
if (trainInputs[0][j] != 0)
trainInputs[0][j] = (trainInputs[0][j] - extrator.min) /
(extrator.max - extrator.min);
}
patNum = 0;
calcNet();
for (int i =0; i<20; i++)
System.out.println(outPred[i]);
return palavras[toint(outPred)];
}
public void Softmax() { //MLogistic activation
double SumExp = 0;
for(int k = 0;k<numOutputs;k++){
SumExp = SumExp + Math.exp(outPred[k]);
}
for(int k = 0;k<numOutputs;k++){
outPred[k] = Math.exp(outPred[k])/SumExp;
errThisPat[k] = trainOutput[patNum][k] - outPred[k];
}
}
public void calcNet() {
for(int k = 0;k<numOutputs;k++){
outPred[k] = 0.0;
for(int j = 0;j<numInputs;j++){
outPred[k] = outPred[k] + (trainInputs[patNum][j] * weights[j][k]);
}
outPred[k] = outPred[k] + weights[numInputs][k]; //bias
errThisPat[k] = trainOutput[patNum][k] - outPred[k];
}
if (softmax) Softmax();
}
public void WeightChanges(){
for(int k = 0;k<numOutputs;k++){
for (int j = 0; j < numInputs; j++){
double delta = LR * errThisPat[k] * trainInputs[patNum][j];
weights[j][k] = weights[j][k] + delta;
}
weights[numInputs][k] = weights[numInputs][k] + (LR * errThisPat[k]); //bias
}
}
public void initWeights(){
Random random = new Random();
for(int j = 0;j<numOutputs;j++){
78 for(int i = 0;i<numInputs;i++)
weights[i][j] = 0.1*random.nextGaussian();
weights[numInputs][j] = 0.1*random.nextGaussian();//bias
}
}
public void initData(){
DecimalFormat format = new DecimalFormat();
format.setMinimumIntegerDigits(2);
format.setMaximumFractionDigits(0);
for (int i=0; i<60; i++){ //10 palavras, 6 repetições, 6 sessões
int j = i / 6;
double out[] = new double[numOutputs];
out[j]=1;
String num = format.format(i+1);
trainInputs[i] = extrator.Extrair("waves1/c("+num+").wav");
trainOutput[i] = out; //pattern 0 ao 59
trainInputs[i+360] = extrator.Extrair("waves2/c("+num+").wav");
trainOutput[i+360] = out;
trainInputs[i+120] = extrator.Extrair("waves3/c("+num+").wav");
trainOutput[i+120] = out;
trainInputs[i+180] = extrator.Extrair("waves4/c("+num+").wav");
trainOutput[i+180] = out;
trainInputs[i+240] = extrator.Extrair("waves5/c("+num+").wav");
trainOutput[i+240] = out;
trainInputs[i+300] = extrator.Extrair("waves6/c("+num+").wav");
trainOutput[i+300] = out;
}
for (int i=0; i<60; i++){ //+10 palavras, 6 repetições, 6 sessões
int j = i / 6;
double out[] = new double[numOutputs];
out[j+10]=1;
String num = format.format(i+1);
trainInputs[i+60] = extrator.Extrair("waves7/c("+num+").wav");
trainOutput[i+60] = out; //pattern 60 ao 119
trainInputs[i+60+360] = extrator.Extrair("waves8/c("+num+").wav");
trainOutput[i+60+360] = out;
trainInputs[i+120+360] = extrator.Extrair("waves9/c("+num+").wav");
trainOutput[i+120+360] = out;
trainInputs[i+180+360] = extrator.Extrair("waves10/c("+num+").wav");
trainOutput[i+180+360] = out;
trainInputs[i+240+360] = extrator.Extrair("waves11/c("+num+").wav");
trainOutput[i+240+360] = out;
trainInputs[i+300+360] = extrator.Extrair("waves12/c("+num+").wav");
trainOutput[i+300+360] = out;
}
PrintStream padroes = null;
try {
padroes = new PrintStream(new FileOutputStream("padroes.txt"));
}
catch (FileNotFoundException ex) {
}
padroes.print("Palavra");
for (int ti=0; ti<numInputs; ti++){
79 padroes.print("\t");
padroes.print("TrainInput"+ti);
}
padroes.println();
for (int i=0; i<numPatterns; i++){
padroes.print(palavras[toint(trainOutput[i])]);
for (int j=0; j<numInputs; j++){
if (trainInputs[i][j] != 0)
trainInputs[i][j] = (trainInputs[i][j] - extrator.min) /
(extrator.max - extrator.min);
padroes.print("\t");
padroes.print(trainInputs[i][j]);
}
padroes.println();
}
System.out.print("maximo = "+extrator.max);
System.out.print("minimo = "+extrator.min);
numPatterns = 120;
}
public void displayResults(){
PrintStream acertos = null, err = null;
try {
acertos = new PrintStream(new FileOutputStream("acertos.txt"));
err = new PrintStream(new FileOutputStream("err.txt"));
}
catch (FileNotFoundException ex) {
}
numPatterns = 720;
int acertostst = 0, acertostrn = 0;
for(int i = 0; i<numPatterns; i++){
patNum = i;
calcNet();
int actual = toint(trainOutput[patNum]);
int model = toint(outPred);
double value = outPred[actual];
double sumerr = sum(outPred) - outPred[model];
if (i < 120){ //conj. trein.
if (actual == model) {
acertostrn++;
}
else {
}
}else{ //conj. teste
if (actual == model){
acertostst++;
acertos.println(value);
}
else{
err.println(value);
}
}
/* System.out.println("pat = " + (patNum+1)
+ " actual = " + palavras[actual]
+ " neural model = " + palavras[model]
+ " >>value "+ value+ " **sumerr "+ sumerr);*/
}
System.out.println("ACERTOS NO TESTE = "+ acertostst);
System.out.println("ACERTOS NO TREINAMENTO = "+ acertostrn);
}
80
public void calcOverallError(){
Error = 0.0;
double E = 0.0;
for(int i = 0;i<numPatterns;i++){
patNum = i;
calcNet();
double Ep = 0.0;
for (int k = 0; k < numOutputs; k++){
Ep = Ep + (errThisPat[k]*errThisPat[k]/(2*numOutputs));
}
Error = Error + Ep/(numPatterns);
}
Error = Math.sqrt(Error);
}
public int toint(double[] d){
double great = Integer.MIN_VALUE;
int index = -1;
for (int i = 0; i<d.length; i++){
if (d[i] == 1) return i;
if (d[i] > great) {
great = d[i];
index = i;
}
}
return index;
}
public double sum(double[] d){
double s = 0;
for (int i = 0; i<d.length; i++)
s = s+Math.sqrt(d[i]*d[i]);
return s;
}
}
RedeNeural.java Created with JBuilder
81
APÊNDICE B – Algoritmos de extração usando STFT
Extrator.java Created with JBuilder package DSP;
import java.io.*;
import java.io.IOException;
import javax.sound.sampled.*;
import javax.sound.sampled.AudioInputStream;
public class Extrator {
public double[] data;
static int txamostra = 8000;
static int framelength = 512; //divisível por 2
//framelength*frames > length
static int length = 8192; //numero de amostras lidas
static int frames = 2*length/framelength;//50% de sobreposição
static int nsb = 5; //número de subbandas analisadas
double[] mags;
double[] centroides;
double[] janela = new double[framelength];
public double max=Double.NEGATIVE_INFINITY,
min=Double.POSITIVE_INFINITY;
public Extrator(){
double x = -1;
for (int i=0; i<framelength; i++){
//Gaussian
//janela[i] = Math.exp(-0.5*(Math.pow(2.5*x,2)));
//Hann
janela[i] = (0.5*(1+Math.cos(Math.PI*(x))));
//Blackmann
//janela[i] = (0.42 -0.5*Math.cos(2*Math.PI*((1+x)/2))
// +0.08*Math.cos(4*Math.PI*((1+x)/2)));
x = x + 2.0/framelength;
}
}
public double[] Extrair(String nomearquivo) {
data = this.readwave(nomearquivo);
return PowerSpectrum2(data);
}
public double[] Centroides(double[] data){
mags = new double[(framelength/2)*frames];
centroides = new double[frames];
double[] frame = new double[framelength];
int p = 0, numframe = 0;
while (p+framelength <= length) {
82 for (int i=0; i<framelength; i++) //Janelamento
frame[i] = data[p+i]*janela[i];
double[] magnitude = new double[framelength];
double[] real = new double[framelength];
double[] imag = new double[framelength];
double[] angle = new double[framelength];
ForwardRealToComplexFFT01.transform(frame,real,imag,angle,magnitude);
double pfreq = txamostra/framelength;
double num = 0, den = 0;
for(int i = 0; i < framelength/2; i++){ //abaixo da freq/2
magnitude[i] = log10(1+magnitude[i]);
num = num + i * pfreq * magnitude[i]; //Frequencia * Intensidade
den = den + magnitude[i];
}
centroides[numframe] = (num/den);
if (centroides[numframe]>max) max = centroides[numframe];
if (centroides[numframe]<min) min = centroides[numframe];
System.arraycopy(magnitude,0,mags,(framelength/2)*numframe,framelength/2);
numframe++;
p = p + length/frames;
}
return centroides;
}
public double[] PowerSpectrum(double[] data){
Centroides(data);
return mags;
}
public double[] PowerSpectrum2(double[] data){
mags = new double[nsb*frames];
double[] frame = new double[framelength];
int p = 0, numframe = 0;
while (p+framelength <= length) {
for (int i=0; i<framelength; i++)
frame[i] = data[p+i]*janela[i]; //Janelamento
double[] magnitude = new double[framelength];
double[] real = new double[framelength];
double[] imag = new double[framelength];
double[] angle = new double[framelength];
ForwardRealToComplexFFT01.transform(frame,real,imag,angle,magnitude);
int pf = framelength/(int)Math.pow(2,nsb),
numband = 1;
for (int i=0; i<pf; i++)//numband = 0
mags[numframe*nsb] = mags[numframe*nsb]+magnitude[i];
mags[numframe*nsb] = log10(1+mags[numframe*nsb]);
while (pf < framelength/2) {
for(int i=pf; i<(pf*2); i++)
mags[numband+numframe*nsb] = mags[numband+numframe*nsb]
+ magnitude[i]*magnitude[i];
mags[numband+numframe*nsb] = log10(1+mags[numband+numframe*nsb]);
numband++;
pf = pf*2;
}
for (int i=0; i<nsb; i++){
83 if (mags[numframe * nsb + i] > max) max = mags[numframe * nsb + i];
if (mags[numframe * nsb + i] < min) min = mags[numframe * nsb + i];
}
numframe++;
p = p + length/frames;
}
return mags;
}
public double[] readwave(String filename){
byte[] audioBytes = null;
try {
AudioInputStream audioInputStream =
AudioSystem.getAudioInputStream(new File(filename));
audioInputStream = AudioSystem.
getAudioInputStream(getAudioFormat(), audioInputStream);
if (audioInputStream.getFormat().getSampleSizeInBits() != 8)
throw new RuntimeException("File format not supported: " + filename);
int nlengthInFrames = (int) audioInputStream.getFrameLength();
audioBytes = new byte[nlengthInFrames];
audioInputStream.read(audioBytes);
}
catch (Exception ex) {
ex.printStackTrace();
}
int start, end;
for (start = 0; start < audioBytes.length; start++)
if(audioBytes[start] > 128*0.1) break;
//detecta primeiro pico (vogal)
start = start - txamostra/10;
//recua 100ms (incluir eventual consoante)
end = start + length;
double[] data = new double[length];
for (int i=0; i+start < end; i++)
data[i]=audioBytes[i+start];
return data;
}
private AudioFormat getAudioFormat(){
float sampleRate = 8000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 8;
//8,16
int channels = 1;
//1,2
boolean signed = true;
//true,false
boolean bigEndian = false;
//true,false
return new AudioFormat(
sampleRate,
sampleSizeInBits,
channels,
signed,
bigEndian);
}//end getAudioFormat
84 // log10: Logarithm base 10
public static double log10(double d) {
return Math.log(d)/Math.log(10.0);
}
public double[] PowerSpectrum3(double[] data){
return null;
}
}
Extrator.java Created with JBuilder
85
APÊNDICE C – Algoritmos de extração usando DWT
ExtratorWavelet.java Created with JBuilder package DSP;
import java.io.*;
public class ExtratorWavelet extends Extrator {
public ExtratorWavelet() {
}
public double[] PowerSpectrum(double[] data){
int ncoeficientes=8192;
mags = new double[13];
Daub daub = new Daub();
daub.daubTrans(data);
int p = 1, numband = 0;
while (p < ncoeficientes) {
for(int i=p; i<(p*2); i++){
mags[numband] = mags[numband] + data[i]*data[i];
}
mags[numband] = log10(1+mags[numband]);
numband++;
p = p*2;
}
for (int i=0; i<13; i++){
if (mags[i]>max) max = mags[i];
if (mags[i]<min) min = mags[i];
}
return mags;
}
public double[] PowerSpectrum2(double[] data){
Daub daub = new Daub();
daub.daubTrans(data);
int ncoeficientes=8192,
blperband = 8, //qtos frames
numband = 9, //primeira subbanda considerada
p = (int)Math.pow(2,numband),
inicio=blperband*numband;
mags = new double[(13*blperband)-inicio];
while (p < ncoeficientes) {
int tmbl = p / blperband;
int offset = numband*blperband -inicio;
for(int i=p; i<(p*2); i++){
int p2 = i/tmbl - blperband;
mags[offset+p2] = mags[offset+p2] + data[i]*data[i];
}
numband++;
p = p*2;
}
for (int i=0; i<mags.length; i++){
86 mags[i] = log10(1+mags[i]);
if (mags[i]>max) max = mags[i];
if (mags[i]<min) min = mags[i];
}
int index = 0;
double[] mags2 = new double[(13*blperband)-inicio]; //reordenar
for (int bl=0; bl<blperband; bl++){
for (int ba=0; ba<mags.length/blperband; ba++){
mags2[index] = mags[(ba*blperband)+bl];
index++;
}
}
return mags;
}
public double[] PowerSpectrum3(double[] data){
mags = new double[64+32+16+8];
Daub daub = new Daub();
daub.daubTrans(data);
int ncoeficientes=8192,
tmbl = 64,
p = 512,
p1 = 0;
while ( p < ncoeficientes) {
int blperband = p/tmbl;
for(int i=p; i<(p*2); i++){
int p2 = i/tmbl - blperband;
mags[p1+p2] = mags[p1+p2] + data[i]*data[i];
}
p = p*2;
p1 = p1 + blperband;
}
for (int i=0; i<mags.length; i++){
mags[i] = log10(1+mags[i]);
if (mags[i]>max) max = mags[i];
if (mags[i]<min) min = mags[i];
}
return mags;
}
public double[] Extrair(String nomearquivo) {
return PowerSpectrum3(this.readwave(nomearquivo));
}
}
ExtratorWavelet.java Created with JBuilder
87
ANEXO A – Código fonte da FFT
ForwardRealToComplexFFT01.java Created with JBuilder package DSP;
/*File ForwardRealToComplexFFT01.java
Copyright 2004, R.G.Baldwin
Rev 5/14/04
*/
public class ForwardRealToComplexFFT01{
public static void transform(
double[] data,
double[] realOut,
double[] imagOut,
double[] angleOut,
double[] magnitude){
double pi = Math.PI;//for convenience
int dataLen = data.length;
//The complexToComplex FFT method does an
// in-place transform causing the output
// complex data to be stored in the arrays
// containing the input complex data.
// Therefore, it is necessary to copy the
// input data to this method into the real
// part of the complex data passed to the
// complexToComplex method.
System.arraycopy(data,0,realOut,0,dataLen);
//Perform the spectral analysis. The results
// are stored in realOut and imagOut. The +1
// causes it to be a forward transform. A -1
// would cause it to be an inverse transform.
complexToComplex(1,dataLen,realOut,imagOut);
//Compute the magnitude and the phase angle
// in degrees.
for(int cnt = 0;cnt < dataLen;cnt++){
magnitude[cnt] =
(Math.sqrt(realOut[cnt]*realOut[cnt]
+ imagOut[cnt]*imagOut[cnt]))/(dataLen);
if(imagOut[cnt] == 0.0
&& realOut[cnt] == 0.0){
angleOut[cnt] = 0.0;
}//end if
else{
angleOut[cnt] = Math.atan(
imagOut[cnt]/realOut[cnt])*180.0/pi;
}//end else
if(realOut[cnt] < 0.0
&& imagOut[cnt] == 0.0){
angleOut[cnt] = 180.0;
}else if(realOut[cnt] < 0.0
&& imagOut[cnt] == -0.0){
angleOut[cnt] = -180.0;
}else if(realOut[cnt] < 0.0
&& imagOut[cnt] > 0.0){
88 angleOut[cnt] += 180.0;
}else if(realOut[cnt] < 0.0
&& imagOut[cnt] < 0.0){
angleOut[cnt] += -180.0;
}//end else
}//end for loop
}//end transform method
//-------------------------------------------//
//This method computes a complex-to-complex
// FFT. The value of sign must be 1 for a
// forward FFT.
public static void complexToComplex(
int sign,
int len,
double real[],
double imag[]){
double scale = 1.0;
//Reorder the input data into reverse binary
// order.
int i,j;
for (i=j=0; i < len; ++i) {
if (j>=i) {
double tempr = real[j]*scale;
double tempi = imag[j]*scale;
real[j] = real[i]*scale;
imag[j] = imag[i]*scale;
real[i] = tempr;
imag[i] = tempi;
}//end if
int m = len/2;
while (m>=1 && j>=m) {
j -= m;
m /= 2;
}//end while loop
j += m;
}//end for loop
//Input data has been reordered.
int stage = 0;
int maxSpectraForStage,stepSize;
//Loop once for each stage in the spectral
// recombination process.
for(maxSpectraForStage = 1,
stepSize = 2*maxSpectraForStage;
maxSpectraForStage < len;
maxSpectraForStage = stepSize,
stepSize = 2*maxSpectraForStage){
double deltaAngle =
sign*Math.PI/maxSpectraForStage;
//Loop once for each individual spectra
for (int spectraCnt = 0;
spectraCnt < maxSpectraForStage;
++spectraCnt){
double angle = spectraCnt*deltaAngle;
double realCorrection = Math.cos(angle);
double imagCorrection = Math.sin(angle);
int right = 0;
for (int left = spectraCnt;
left < len;left += stepSize){
right = left + maxSpectraForStage;
double tempReal =
89 realCorrection*real[right]
- imagCorrection*imag[right];
double tempImag =
realCorrection*imag[right]
+ imagCorrection*real[right];
real[right] = real[left]-tempReal;
imag[right] = imag[left]-tempImag;
real[left] += tempReal;
imag[left] += tempImag;
}//end for loop
}//end for loop for individual spectra
maxSpectraForStage = stepSize;
}//end for loop for stages
}//end complexToComplex method
}//end class ForwardRealToComplexFFT01
ForwardRealToComplexFFT01.java Created with JBuilder
90
ANEXO B – Código fonte da transformada wavelet Daubechies 4
Daub.java Created with JBuilder package DSP;
/*
http://www.bearcave.com/software/java/wavelets/daubechies.html
Ian Kaplan, July 2001
Revised: November 2001
*/
import java.lang.Math.*;
class Daub {
protected final double sqrt_3 = Math.sqrt( 3 );
protected final double denom = 4 * Math.sqrt( 2 );
//
// forward transform scaling (smoothing) coefficients
//
protected final double h0 = (1 + sqrt_3)/denom;
protected final double h1 = (3 + sqrt_3)/denom;
protected final double h2 = (3 - sqrt_3)/denom;
protected final double h3 = (1 - sqrt_3)/denom;
//
// forward transform wavelet coefficients
//
protected final double g0 = h3;
protected final double g1 = -h2;
protected final double g2 = h1;
protected final double g3 = -h0;
//
// Inverse transform coefficients for smoothed values
//
protected final double Ih0 = h2;
protected final double Ih1 = g2; // h1
protected final double Ih2 = h0;
protected final double Ih3 = g0; // h3
//
// Inverse transform for wavelet values
//
protected final double Ig0 = h3;
protected final double Ig1 = g3; // -h0
protected final double Ig2 = h1;
protected final double Ig3 = g1; // -h2
/**
Forward wavelet transform.
Note that at the end of the computation the
calculation wraps around to the beginning of
the signal.
*/
protected void transform( double a[], int n )
{
if (n >= 4) {
int i, j;
int half = n >> 1;
double tmp[] = new double[n];
91 i = 0;
for (j = 0; j < n-3; j = j + 2) {
tmp[i] = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3;
tmp[i+half] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3;
i++;
}
tmp[i] = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3;
tmp[i+half] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3;
for (i = 0; i < n; i++) {
a[i] = tmp[i];
}
}
} // transform
protected void invTransform( double a[], int n )
{
if (n >= 4) {
int i, j;
int half = n >> 1;
int halfPls1 = half + 1;
double tmp[] = new double[n];
// last smooth val last coef. first smooth first coef
tmp[0] = a[half-1]*Ih0 + a[n-1]*Ih1 + a[0]*Ih2 + a[half]*Ih3;
tmp[1] = a[half-1]*Ig0 + a[n-1]*Ig1 + a[0]*Ig2 + a[half]*Ig3;
j = 2;
for (i = 0; i < half-1; i++) {
// smooth val coef. val smooth val coef. val
tmp[j++] = a[i]*Ih0 + a[i+half]*Ih1 + a[i+1]*Ih2 + a[i+halfPls1]*Ih3;
tmp[j++] = a[i]*Ig0 + a[i+half]*Ig1 + a[i+1]*Ig2 + a[i+halfPls1]*Ig3;
}
for (i = 0; i < n; i++) {
a[i] = tmp[i];
}
}
}
/**
Forward Daubechies D4 transform
*/
public void daubTrans( double s[] )
{
final int N = s.length;
int n;
for (n = N; n >= 4; n >>= 1) {
transform( s, n );
}
}
/**
Inverse Daubechies D4 transform
*/
public void invDaubTrans( double coef[])
{
final int N = coef.length;
int n;
for (n = 4; n <= N; n <<= 1) {
invTransform( coef, n );
}
}
} // daub
Daub.java Created with JBuilder