Ajuste seu Modelo de Áudio para Melhor Reconhecimento de Fala

Ajuste a precisão da entrada de áudio com essas estratégias e ferramentas

Lidar com um modelo de áudio preparado de forma inadequada pode ser frustrante, especialmente para iniciantes do campo do reconhecimento de fala, que estão trabalhando com seus próprios modelos dependentes do alto-falante. Ao contrário da entrada de teclado e mouse, que é relativamente positiva em ação e facilmente interpretada pelo sistema operacional, a entrada de áudio para um reconhecedor de fala é menos positiva e depende bastante da amplitude e da intensidade do modelo de áudio. Os programadores podem facilitar o processo de análise de erros de reconhecimento fornecendo ferramentas. Um objetivo razoável é passar de cinco erros em dez para menos de um em mil: Descubra como utilizando ferramentas construídas com o Python e PostgreSQL.

Colin Beckingham, Writer and Researcher, Freelance

Colin Beckingham é pesquisador freelancer, escritor e programador. Ele mora na região leste de Ontário, no Canadá. Com diplomas da Universidade de Queen, em Kingston, e da Universidade de Windsor, atuou em uma grande variedade de áreas, incluindo o setor financeiro, horticultura, corrida de cavalos, ensino, serviço público e viagens e turismo. Autor de aplicativos de banco de dados, inúmeros jornais, revistas e artigos on-line. Seu interesse em pesquisa inclui programação de software livre, VoIP e aplicativos por controle de voz no Linux. É possível entrar em contato com Colin através do e-mail colbec@start.ca.



28/Mai/2014

Terminologia

  • Gramática. Um conjunto finito de palavras únicas ou combinações de palavras dentre as quais o reconhecedor de fala pode escolher
  • Grafema. Como uma palavra é escrita ou impressa
  • Lexema. Uma descrição geral de como uma palavra é escrita e pronunciada
  • Léxico. Uma lista de lexemas; nesse exemplo, um arquivo que contém, em cada linha, como uma palavra é escrita e pronunciada
  • Fonema. Um marcador para um som; diversos fonemas encadeados representam como uma palavra soa
  • PLS. Veja o link para a Especificação do Léxico de Pronúncia em Recursos para saber mais sobre esses termos

É possível facilmente criar um modelo simples de áudio dependente de alto-falante para reconhecimento de fala seguindo o tutorial do VoxForge, utilizando ferramentas como o Hidden Markov Model Toolkit (HTK), Julius e CMU Sphinx (consulte Recursos para saber mais sobre essas ferramentas). Em poucas horas, é possível ter seu próprio computador HAL 9000, de 2001: Uma Odisseia no Espaço , respondendo aos seus comandos e conversando com você, com uma pequena probabilidade de encontrar a porta de sua sala fechada caso saia de sua estação de trabalho para ir ao banheiro.

No entanto, às vezes, os iniciantes ficam surpresos com o fato de que a precisão do reconhecimento de seu primeiro modelo é inaceitável. É fácil desistir de outra experiência em controle de voz, pensando que o campo não avançou para um nível aceitável de precisão. Isso está longe de ser verdade.

Além disso—e talvez com maior gravidade—quanto mais erros você encontra e quanto mais se concentra em falar de forma cuidadosa no microfone para que um reconhecedor aparentemente obstinado o entenda, maiores as chances de forçar a voz à medida que tenta controlar suas cordas vocais de forma natural a fim de chegar aos resultados esperados. Há bons motivos para buscar maior precisão no reconhecimento de voz usando uma fala mais calma.

A simples inclusão de mais amostras de áudio pode ser uma solução efetiva para esse problema. Além disso, a adaptação de um modelo pré-configurado independente de alto-falante é outro caminho possível (consulte os recursos do VoxForge e CMU Sphinx para orientação sobre como isso pode ser feito). Um terceiro método é concentrar-se no problema da baixa precisão do reconhecimento utilizando ferramentas de programação e criar correções voltadas ao problema fundamental.

Os programadores podem desempenhar um papel na mitigação da baixa precisão do reconhecimento. Ferramentas que descrevem o ambiente no qual você está trabalhando podem ajudar a identificar a natureza dos problemas de reconhecimento e estimular os usuários a se concentrarem rapidamente no problema de configuração básica e nas possíveis soluções.

O HTK fornece várias ferramentas para a fase de criação do modelo e o Julius fornece mensagens descritivas sobre a fase de reconhecimento. No entanto, há limites para essa abordagem: Por exemplo, os gravadores do HTK e do Julius não conseguem fazem suposições sobre qual gramática você deseja utilizar. Você é responsável por lidar com os erros resultantes da sua escolha de gramática.

As seções a seguir discutem alguns problemas específicos que podem surgir, com exemplos e comentários sobre a possibilidade de haver uma ferramenta para ajudar a identificar e resolver o problema.

Tipos de problemas

Considerando os tipos de erros que podem interferir na precisão de reconhecimento, é possível discernir uma série de motivos diferentes para eles:

  • O conceito familiar de "entra lixo, sai lixo" leva ao problema do modelo difuso . A menos que os prompts de amostra fornecidos ao processo de criação do modelo de áudio sejam limpos e relevantes, o HTK não poderá criar o modelo de forma adequada. Por exemplo, é possível que os arquivos .wav gravados não correspondam aos prompts corretos; que o arquivo .wav seja aceitável, mas somente decifrado pelo HTK com dificuldade (talvez devido às discrepâncias de volume); que existam sons omitidos resultantes de silêncios curtos entre palavras; ou que cliques, estampidos e sons de fundo sejam ouvidos. A solução é investigar os problemas do arquivo de áudio e, talvez, registrá-lo novamente.
  • O modelo restrito é exibido caso tente utilizar um modelo dependente de alto-falante treinado com uma voz diferente da sua. Nesse caso, seus resultados provavelmente serão ruins. Além disso, caso treine um modelo com um fone com fio e, em seguida, tente utilizar o modelo gerado para emitir comandos com um fone Bluetooth, é possível que sua precisão de reconhecimento caia para menos de 50%, mesmo que esteja utilizando a mesma voz. Ainda mais, com o mesmo fone, mas conectado a uma máquina diferente, seus resultados novamente serão uma decepção. É possível chamar essa amplitude inadequada do modelo e solucioná-la incluindo arquivos de áudio específicos à pessoa, dispositivo ou plataforma no qual o problema ocorre.
  • Modelos de áudio precisam de amplitude e intensidade. As pessoas têm diferentes formas de dizer a mesma coisa de maneiras diversas, devido ao estado emocional, às condições atmosféricas, entre outros. Mesmo sem nenhuma mudança na plataforma operacional, no alto-falante ou no dispositivo de fone, se o falante estiver gripado ou se sentir impaciente ou levemente embriagado, a voz mudará dramaticamente ou sutilmente—o suficiente para confundir um modelo treinado em diferentes condições, levando a um modelo superficial (1). É possível aumentar a intensidade examinando o léxico de perto para descrições precisas de como as palavras soam e editando e incluindo mais entradas de léxico, se necessário.
  • O modelo superficial (2) é semelhante ao ponto anterior, mas não exatamente o mesmo. No mesmo dia, com a mesma voz, nas mesmas condições, há palavras pronunciadas de maneira diferente talvez com base no contexto ou capricho. Por exemplo: Tanzania: é [Tanza-niya], [Tan-Zania] ou ambos? Schedule ([sked-ule], [shed-ule]), status ([stay-tus], [stattus])? Você pode tentar ser consistente ou incluir mais entradas ao léxico. Outro problema sutil são os silêncios longos e curtos entre palavras em gravações de áudio.
  • O modelo é baseado em fonemas, que são representações de som discretas do que o reconhecedor espera ouvir. Os fonemas são armazenados no léxico e as imprecisões ou inconsistências no fonema e seus sons associados podem levar a erros. É possível suavizar o problema de divisão incorreta de fonemas das palavras utilizadas ou falta de pronúncias alternativas identificando e corrigindo a entrada no léxico.
  • Infelizmente, muitos idiomas oferecem um equilíbrio ruim no uso de fonemas na fala normal, resultando em um equilíbrio fonêmico incompleto na gramática. Em casos nos quais os fonemas não são bem representados devido ao uso não frequente no idioma, há a chance de ocorrer problemas, pois sua oportunidade de exercitá-los será limitada. Em minhas próprias gramáticas da língua inglesa, os fonemas do conjunto ([ax], [n], [s], [t]) tendem a ser amplamente utilizados; por outro lado, os do conjunto ([oy], [ar], [el], [ur]) são raramente utilizados. A solução é identificar as regras do problema e, em seguida, ajustar a gramática, utilizar sinônimos, visualizar a saída do HDManou mesmo inventar seus próprios termos não padrão que exercitam os fonemas menos utilizados.
  • O problema de lexemas estreitamente relacionados fonemicamente surge da linguagem diária que nos força a utilizar palavras que podem ser difíceis de separar no nível do reconhecedor, portanto, a escolha de comandos na gramática é uma arte. Às vezes, meus modelos confundem pipe e nine: Minha solução foi mudar pipe para as palavras compostas pipe_symbol ou vertical_bar.

Ferramentas

Caso sua gramática tenha somente algumas regras e uma delas apresente problemas de reconhecimento de forma consistente, é possível enfatizar o problema rapidamente. No entanto, com gramáticas maiores, é necessário um método para testar a precisão do modelo de forma sistemática.

Ferramenta 1: Identificar palavras com problemas

A Ferramenta 1 é uma rotina de teste para identificar as combinações de palavra que são problemáticas e armazená-las para revisão posterior. Aqui, o benefício é, em vez de incluir mais amostras no geral, somente incluir mais exemplos dessas regras de gramática com as quais o reconhecedor tem dificuldade e que economizam tempo.

A máquina lê o arquivo de prompts, armazena as entradas em uma matriz e as ordena aleatoriamente, apresentando os prompts um a um na tela ou por áudio, solicitando a leitura de cada um para o reconhecedor. Em seguida, o script compara a saída do Julius com o que ele esperava ouvir. Caso eles sejam diferentes, ele registra o problema para análise posterior e passa para o próximo prompt.

Esse script utiliza o Python (consulte Recursos) e armazena os problemas em um back end do PostgreSQL (consulte Recursos). É possível fazer a mesma coisa com PHP, Perl e MySQL ou outras ferramentas. A escolha faz algumas suposições sobre seu ambiente de trabalho: Primeiro, há um arquivo simples de "prompts" que consiste em uma lista de regras de gramática testáveis e os nomes do arquivo de áudio associado. Eles são organizados pelo nome do arquivo, seguido pelo prompt, que pode ser uma ou duas palavras. Segue um exemplo. Nessa ferramenta, o nome do arquivo de áudio não está sendo utilizado, portanto, um arquivo separado com apenas prompts de amostra também serviria:

*/mysample1     ONE
*/mysample2     COMPUTER     QUIT

Além disso, há uma tabela PostgreSQL configurada com quatro campos: um número de ID para criar registros e três campos de caractere variável—um para armazenar o dispositivo que está sendo utilizado para o teste, outro para armazenar o que o computador pediu e o terceiro para armazenar o que o reconhecedor pensou ter ouvido. Na Listagem 1, testprom.py é o nome do script, fone é um identificador para o fone que está sendo utilizado e 100 é o número de prompts que deseja testar antes da interrupção do script. A saída de Julius é canalizada para o script.

Listagem 1. Teste seus prompts com o Python e PostgreSQL
#
# chame com:
# julius (suas opções) -quiet -C julian.jconf | python testprom.py headset 100
#
import sys
import string as str
import os
import random
import psycopg2
# configuração do banco de dados
conn = psycopg2.connect("host='xxx' user='yyy' password='zzz' dbname='qqq'")
cur = conn.cursor()
# obtenha os argumentos da linha de comandos
device = sys.argv[1]
limit = int(sys.argv[2]) # converter a sequência de CLI para número inteiro
# obtenha os prompts
proms = []
f = open('prompts', 'r')
for prompt in f:
  words = str.split(prompt)
  if len(words) == 2:
    thisprom = words[1]
  if len(words) == 3:
    thisprom = words[1]+' '+words[2]
  if thisprom not in proms:
    proms.append(thisprom)
f.close()
random.shuffle(proms)
# execute os testes
i = 0
challengeprom = "please say something"
print challengeprom
while i < limit:
  line = sys.stdin.readline()
  if line[:4] == "sent":
    line = str.replace(line,"sentence1: <s> ","")
    line = str.replace(line," </s>","")
    heardprom = str.strip(line)
    if heardprom == challengeprom or i == 0:
      print "OK"
    else:
      sql = "insert into gramerrors (device, prompt, heard) values (%s,%s,%s)"
      data = (device,challengeprom,heardprom)
      cur.execute(sql, data)
      conn.commit()
      print "problem recorded: <"+challengeprom+'> <'+heardprom+'>'
    #
    challengeprom = proms[i]
    print challengeprom
    i += 1
# arrume
cur.close()
conn.close()

Na Listagem 1 (fundamentalmente, é um gerenciador de diálogos altamente especializado), primeiro, é preciso importar as bibliotecas necessárias, em seguida, estabelecer a conexão ao back end do PostgreSQL e ler nos parâmetros da linha de comandos. Então, o script abre o arquivo de prompts para a leitura e lê linha a linha, armazenando os prompts em uma lista, mas somente se eles já não estão nela. Ao terminar a leitura, ele ordena a lista aleatoriamente.

Em seguida, o script percorre os prompts ordenados aleatoriamente começando pelo topo da lista. Ela apresenta cada um na tela (também seria possível que o Festival—consulte Recursos—os anunciasse) e espera pela saída do reconhecedor de fala, que é acionado quando se fala ao microfone; julius decodifica o que ouve. Então, o script compara o prompt esperado com o prompt realmente ouvido. De preferência, eles serão a mesma coisa e o script prossegue para o próximo prompt. Caso haja um problema, o script registra o dispositivo, o prompt esperado e o prompt real no back end antes de prosseguir para o próximo. Ele interrompe quando o limite for alcançado ou o arquivo estiver esgotado.

O resultado é uma tabela de prompts problemáticos e o dispositivo que levantou o problema. Essa tabela é informativa se mais de um dispositivo for regularmente utilizado. À medida que mais testes forem conduzidos em dias diferentes com dispositivos diversos, é possível ter uma ideia de onde os problemas ocorrem. É sempre o mesmo dispositivo? Os mesmos prompts? O Julius gera a mesma regra de gramática incorreta de forma consistente? Esse é o guia para uma análise mais profunda.

Ferramenta 2: Revisar amostras de áudio existentes

Talvez o seu teste mostre que um prompt é consistentemente um problema. Sua primeira suspeita pode ser a de que um ou mais arquivos de áudio para esse prompt está ruim e precisa ser substituído. Provavelmente, o arquivo de áudio não corresponda ao prompt ou o volume esteja muito alto e distorcido ou muito baixo e o HTK teve um problema na extração de dados significativos. As informações necessárias estão no arquivo de prompts. O script na Listagem 2 passa pelos prompts selecionados e reproduz o áudio.

Listagem 2. Revisar amostras de áudio
#
# chamado com "$ python audioreview.py word1 word2"
#
import sys
import string as str
import os
f = open('prompts', 'r')
path = './wavs/'
for line in f:
  words = str.split(line)
  if words[1] == sys.argv[1] and words[2] == sys.argv[2]:
    mywav = words[0] + '.wav'
    wavfil = path + mywav[2:]
    os.system("aplay " + wavfil)

O script importa alguns módulos e abre o arquivo de prompts para leitura. Em seguida, lendo uma linha por vez, ele compara as palavras nos prompts com as palavras especificadas na linha de comandos. Se elas forem as mesmas, o script reproduz o arquivo de áudio relacionado utilizando uma chamada de sistema para um reprodutor de áudio—neste caso, aplay. O script pausa quando reproduz cada arquivo. Nesse caso, está confiando em seus ouvidos para dizer se um dos arquivos de áudio deve ser substituído. O script é uma ferramenta útil para revisar o áudio rapidamente. Caso encontre um ruim, apenas substitua o arquivo de áudio utilizando seu processo de gravação normal.

Ferramenta 3: Revisar a escolha de fonemas no léxico

O léxico é uma lista de palavras e sua representação de fonemas. A Listagem 3 fornece um exemplo do que pode aparecer no léxico.

Listagem 3. Entradas de amostra do léxico
BLACK     [BLACK]     b l ae k
BLUE     [BLUE]     b l uw
BRAVO     [BRAVO]     b r aa v ow
BROWN     [BROWN]     b r aw n

O léxico contém três campos em cada linha: a palavra (lexema), sua representação quando impressa (grafema) e, finalmente, o conjunto ordenado de fonemas que representa a palavra com som. Nesse caso, os três campos são separados por cinco espaços: É importante observar que esse separador permite que o método de divisão da Listagem 4 retenha os fonemas no último campo como um única unidade, pois o campo contém componentes de espaço único.

Para verificar uma palavra, é possível utilizar um script como o da Listagem 4.

Listagem 4. Revisar os fonemas do léxico para uma palavra
#
# chamado com "$ python scanlex.py word"
#
import sys
import string as str
f = open('lextest', 'r')
for line in f:
  words = str.split(line," "*5)
  if words[0] == sys.argv[1]:
    print words

Esse script começa importando os módulos necessários e abrindo o arquivo de léxico para leitura. Ele lê a linha do arquivo e imprime as entradas para as quais o primeiro campo é o mesmo que a palavra que está sendo procurada, conforme especificado na chamada da linha de comandos. Observe que mais de uma entrada pode aparecer para uma determinada palavra, cada uma com uma representação fonêmica diferente. O léxico é classificado alfabeticamente, portanto, seria perfeitamente razoável incluir o código para interromper o processamento do arquivo após a leitura da última "palavra". Recentemente, tive um problema com a palavra seven; incluí uma nova entrada ao léxico com a representação fonêmica levemente não padrão [s eh v ih n], o problema desapareceu imediatamente.

Ferramenta 4: Revisar as escolhas do léxico para a gramática

A Ferramenta 4 expande a ferramenta 3 varrendo a lista de prompts e imprimindo a representação do fonema do léxico para cada palavra na gramática. Além disso, ela consulta o Festival quanto à sua representação da palavra, que pode agir como um guia para mostrar se sua versão do léxico é aproximadamente correta. A Listagem 5 mostra o código.

Listagem 5. Revisar o léxico quanto a palavras da gramática
#
# chamado com "$ python checkphons.py"
#
import sys
import string as str
import os
with open('prompts', 'r') as f:
  wdlist = []
  for line in f:
    words = str.split(line)
    if words[1] not in wdlist:
      wdlist.append(words[1])
    if words[2] not in wdlist:
      wdlist.append(words[2])
with open('lextest', 'r') as f:
  lexwd = []
  lexphon = []
  for line in f:
    lexs = str.split(line,' '*5)
    lexwd.append(str.strip(lexs[0]))
    lexphon.append(str.strip(lexs[2]))
for wd in wdlist:
  #print wd
  if wd in lexwd:
    pos = lexwd.index(wd)
    print wd, lexphon[pos]
    cmd = ("/home/colin/downloads/festival/bin/festival -b \
	      '(format t \"%l\\n\" (lex.lookup \""+wd+"\") ) '")
    os.system(cmd)

A Ferramenta 4 trabalha lendo o arquivo de prompts e armazenando palavras em uma lista. Então, ela faz o mesmo com as palavras e fonemas no léxico. No estágio final, ela varre a lista de palavras do prompt e gera a descrição do fonema para essa palavra a partir do léxico. Para cada palavra, ela chama o Festival e imprime a versão do Festival de como ele acha que a palavra deve soar, como uma comparação. Segue uma saída de exemplo quando esse script é executado com relação ao léxico mínimo na Listagem 3.

BLACK b l ae k
("black" nil (((b l ae k) 1)))
BLUE b l uw
("blue" nil (((b l uw) 1)))
BROWN b r aw n
("brown" nil (((b r aw n) 1)))
BRAVO b r aa v ow
("bravo" nil (((b r aa v) 1) ((ow) 0)))

Observe que ao examinar fonemas, a ferramenta HTK HDMan fornece um resumo da contagem de fonemas utilizados na gramática, que é gerada como parte da saída do tutorial do VoxForge. Para gramáticas maiores, é possível filtrar da mesma maneira que na ferramenta 3.


Conclusão

O uso das ferramentas neste artigo, uma taxa de falha de reconhecimento de um em mil parece, para mim—a partir das minhas próprias experiências em condições silenciosas excelentes—bastante razoável como um objetivo. A simples inclusão de muitos outros prompts de exemplo de diferentes origens pode ajudar a suavizar as discrepâncias nos modelos, contanto que não haja nenhum defeito sério na gramática e no léxico. Pode ser possível alcançar esse objetivo de forma mais rápida com um pouco de cuidado e atenção às palavras e aos arquivos de áudio utilizados para desenvolver o modelo. O resultado é um produto mais satisfatório, uma forma mais eficiente de comunicação com seus dispositivos e cordas vocais mais relaxadas.

Recursos

Aprender

Obter produtos e tecnologias

  • Saiba mais sobre HTK (Hidden Markov Model Toolkit), um kit de ferramentas para o desenvolvimento e a manipulação de modelos Markov ocultos.
  • Obtenha mais informações sobre o kit de ferramentas de fala CMU Sphinx de Carnegie Mellon.
  • Saiba mais sobre o Julius , mecanismo de reconhecimento de fala.
  • Saiba mais sobre o Festival , mecanismo texto-voz.
  • Obtenha mais informações sobre o PostgreSQL , sistema de banco de dados relacional.
  • Avalie os produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto online, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox para saber mais sobre como implementar arquitetura orientada a serviço (SOA) de maneira eficiente.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=823040
ArticleTitle=Ajuste seu Modelo de Áudio para Melhor Reconhecimento de Fala
publish-date=05282014