
Por que estou (e espero que você) esteja interessado em reconhecimento de fala? Em primeiro lugar, essa direção é uma das mais populares em comparação com outras tarefas da linguística de computadores, uma vez que a tecnologia de reconhecimento de fala agora é usada em quase todos os lugares - desde o reconhecimento de um simples sim / não no call center automático do banco até a capacidade de oferecer suporte a "conversa fiada" em "Coluna inteligente" como "Alice". Em segundo lugar, para que o sistema de reconhecimento de fala seja de alta qualidade, é necessário encontrar as ferramentas mais eficazes para criar e configurar esse sistema (este artigo é dedicado a uma dessas ferramentas). Finalmente, o indiscutível "plus" de escolher uma especialização no campo do reconhecimento de fala para mim é que, para pesquisas nessa área, é necessário ter habilidades tanto de programador quanto de linguística. Isso é muito estimulante, forçando a aquisição de conhecimento em diferentes disciplinas.
Por que Kaldi, afinal, existem outras estruturas para reconhecimento de fala?
Para responder a essa pergunta, vale a pena considerar os análogos existentes e os algoritmos e tecnologias usados por eles (os algoritmos usados no Kaldi são descritos mais adiante no artigo):
- CMU Sphinx
CMU Sphinx (não deve ser confundido com o mecanismo de busca Sphinx!) É um sistema de reconhecimento de fala criado por desenvolvedores da Carnegie Mellon University e consiste em vários módulos para extrair recursos de fala, reconhecimento de fala (inclusive em dispositivos móveis) e treinamento para esse reconhecimento. O CMU Sphinx usa modelos de Markov ocultos no nível de reconhecimento acústico-fonético e modelos estatísticos de N-gram no nível de reconhecimento linguístico. O sistema também possui vários recursos interessantes: reconhecimento de fala longa (por exemplo, transcrições ou gravações de som de uma entrevista), capacidade de conectar um grande dicionário de centenas de milhares de formas de palavras etc. É importante observar que o sistema está em constante evolução, com cada versão, a qualidade e o desempenho do reconhecimento são aprimorados . Também existem documentação multiplataforma e conveniente. Entre as desvantagens do uso deste sistema, é possível destacar a incapacidade de iniciar o CMU Sphinx “fora da caixa”, porque até a solução de problemas simples requer conhecimento sobre a adaptação do modelo acústico, no campo da modelagem de linguagem, etc. - Julius
Julius é desenvolvido por desenvolvedores japoneses desde 1997, e agora o projeto é apoiado pelo Instituto de Pesquisa em Ciência, Tecnologia e Gerenciamento Avançado de Kyoto. O modelo é baseado em N-gramas e modelos Markov ocultos sensíveis ao contexto; o sistema é capaz de reconhecer a fala em tempo real. As desvantagens incluem distribuição apenas para o modelo em japonês (embora exista um projeto VoxForge que crie modelos acústicos para outros idiomas, em particular para o idioma inglês) e a falta de atualizações estáveis. - RWTH ASR
O modelo foi desenvolvido por especialistas da Universidade Técnica da Renânia-Vestfália desde 2001, consiste em várias bibliotecas e ferramentas escritas em C ++. O projeto também inclui documentação de instalação, vários sistemas de treinamento, modelos, modelos acústicos, modelos de linguagem, suporte para redes neurais, etc. Ao mesmo tempo, o RWTH ASR é praticamente multiplataforma e tem baixa velocidade. - Htk
O HTK (Hidden Markov Model Toolkit) é um conjunto de ferramentas de reconhecimento de fala que foi criado na Universidade de Cambridge em 1989. O kit de ferramentas baseado nos modelos ocultos de Markov é frequentemente usado como uma ferramenta adicional para criar sistemas de reconhecimento de fala (por exemplo, os desenvolvedores do Julius usam essa estrutura). Apesar do código-fonte estar disponível publicamente, o uso do HTK para criar sistemas para usuários finais é proibido pela licença, razão pela qual o kit de ferramentas não é popular agora. O sistema também possui velocidade e precisão relativamente baixas.
No artigo “Análise comparativa de sistemas de reconhecimento de fala de código aberto” (
https://research-journal.org/technical/sravnitelnyj-analiz-sistem-raspoznavaniya-rechi-s-otkrytym-kodom/ ), foi realizado um estudo durante o qual todos os sistemas foram treinados em um caso de idioma inglês (160 horas) e aplicados em um pequeno caso de teste de 10 horas. Como resultado, verificou-se que a Kaldi tem a maior precisão de reconhecimento, um pouco mais rápida que a dos concorrentes em termos de velocidade. Além disso, o sistema Kaldi é capaz de fornecer ao usuário a mais rica seleção de algoritmos para várias tarefas e é muito conveniente de usar. Ao mesmo tempo, enfatiza-se o fato de que o trabalho com documentação pode ser inconveniente para um usuário inexperiente, pois Ele é projetado para profissionais de reconhecimento de fala. Mas, em geral, o Kaldi é mais adequado para pesquisas científicas do que seus equivalentes.
Como instalar o Kaldi
- Faça o download do arquivo no repositório em https://github.com/kaldi-asr/kaldi :

- Descompacte o arquivo, vá para kaldi-master / tools / extras.
- Executamos ./check_dependencies.sh:

Se depois disso você não vir "tudo ok", abra o arquivo kaldi-master / tools / INSTALL e siga as instruções. - Executamos make (estando no kaldi-master / tools, não no kaldi-master / tools / extras):

- Vá para kaldi-master / src.
- Executamos ./configure --shared e você pode configurar a instalação com ou sem a tecnologia CUDA especificando o caminho para o CUDA instalado (./configure --cudatk-dir = / usr / local / cuda-8.0) ou altere o valor inicial “yes "Para" não "(./ configure --use-cuda = no) respectivamente.
Se ao mesmo tempo você vir:

ou você não seguiu a etapa 4 ou precisa fazer o download e instalar o OpenFst: http://www.openfst.org/twiki/bin/view/FST/FstDownload . - Nós fazemos depender.
- Executamos make -j. É recomendável que você digite o número correto de núcleos de processador que você usará ao criar, por exemplo, make -j 2.
- Como resultado, obtemos:

Um exemplo de uso de um modelo com o Kaldi instalado
Como exemplo, usei o modelo kaldi-ru versão 0.6,
você pode baixá-lo neste link :
- Após o download, vá para o arquivo kaldi-ru-0.6 / decode.sh e especifique o caminho para o Kaldi instalado, ele será assim para mim:

- Iniciamos o modelo, indicando o arquivo no qual o discurso deve ser reconhecido. Você pode usar o arquivo decoder-test.wav, este é um arquivo especial para o teste, já está nesta pasta:

- E aqui está o que o modelo reconheceu:

Quais algoritmos são usados, o que sustenta o trabalho?
Informações completas sobre o projeto podem ser encontradas em
http://kaldi-asr.org/doc/ , aqui vou destacar alguns pontos-chave:
- O MFCC acústico (coeficientes cepstrais de frequência de mel) ou os PLPs um pouco menos populares (previsão linear perceptiva - veja H. Hermansky, “Análise preditiva linear perceptiva da fala (PLP) da fala” ) são usados para extrair recursos acústicos do sinal de entrada. No primeiro método, o espectro do sinal original é convertido da escala de Hertz para a escala de giz e, em seguida, os coeficientes cepstrais são calculados usando a transformação inversa de cosseno (https://habr.com/en/post/140828/). O segundo método é baseado na representação de regressão da fala: é construído um modelo de sinal que descreve a previsão da amostra de sinal atual por uma combinação linear - o produto de amostras conhecidas de sinais de entrada e saída e coeficientes de previsão linear. A tarefa de calcular os sinais de fala é reduzida para encontrar esses coeficientes sob certas condições.
- O módulo de modelagem acústica inclui modelos Markov ocultos (HMM), um modelo misto de distribuições gaussianas (GMM), redes neurais profundas, nomeadamente redes neurais com atraso de tempo (TDNN).
- A modelagem de linguagem é realizada usando uma máquina de estados finitos ou FST (transdutor de estado finito). O FST codifica um mapeamento de uma sequência de caracteres de entrada para uma sequência de caracteres de saída e há pesos para a transição que determinam a probabilidade de calcular o caractere de entrada na saída.
- A decodificação ocorre usando o algoritmo forward-reverse.
Sobre a criação do modelo kaldi-ru-0.6
Para o idioma russo, existe um modelo de reconhecimento pré-treinado criado por Nikolai Shmyryov, também conhecido em muitos sites e fóruns como
nsh .
- Para extrair características, foi utilizado o método MFCC, e o modelo acústico-fonético é baseado em redes neurais do tipo TDNN.
- A amostra do treinamento foram as trilhas sonoras de vídeos em russo, baixados do YouTube.
- Para criar um modelo de idioma, usamos o dicionário CMUdict e exatamente o vocabulário que estava no conjunto de treinamento. Devido ao fato de o dicionário conter pronúncias semelhantes de palavras diferentes, foi decidido atribuir a cada palavra o valor de “probabilidade” e normalizá-las.
- Para aprender o modelo de linguagem, foi usada a estrutura RNNLM (modelos de linguagem de rede neural recorrente), baseada, como o nome indica, em redes neurais recorrentes (em vez dos bons e antigos N-gramas).
Comparação com a API do Google Speech e o Yandex Speech Kit
Certamente, um dos leitores, ao ler os parágrafos anteriores, fez uma pergunta: ok, descobrimos que o Kaldi é superior aos seus análogos diretos, mas e os sistemas de reconhecimento do Google e do Yandex? Talvez a relevância das estruturas descritas anteriormente seja duvidosa se existem ferramentas desses dois gigantes? A pergunta é muito boa, então vamos testar!
- Como conjunto de dados, pegamos os registros e a descriptografia de texto correspondente do notório VoxForge . Como resultado, depois que cada sistema reconheceu 3677 arquivos de som, recebi os seguintes valores WER (Word Error Rate):

- Os registros do VoxForge são aproximadamente semelhantes na ausência de ruído de fundo, entonação, velocidade da fala etc. Vamos complicar a tarefa: pegue o subcorpus de validação open_stt, que inclui conversas telefônicas, clipes de áudio de vídeos do YouTube e audiolivros e avalie o desempenho usando WER e CER (Taxa de erro de caracteres).
Depois de receber as transcrições de texto, notei que o Google e o Yandex (ao contrário de Kaldi) reconheceram palavras como
"Um" como "1". Dessa forma, houve a necessidade de corrigir esses casos (como nas transcrições de referência fornecidas pelos autores do open_stt, tudo é apresentado em termos alfabéticos), o que afetou o resultado final:

Resumindo, podemos dizer que todos os sistemas lidaram com a tarefa aproximadamente no mesmo nível, e Kaldi não era muito inferior ao Yandex Speech Kit e à API do Google Speech. No segundo caso, o Yandex Speech Kit tem o melhor desempenho, pois ele reconhece melhor arquivos de áudio curtos em comparação com concorrentes que não conseguiram reconhecer nenhuma parte deles (para o Google, o número desses arquivos é muito grande). Por fim, vale ressaltar que o Kaldi levou mais de 12 horas para reconhecer os arquivos 28111, outros sistemas gerenciados em muito menos tempo. Mas, ao mesmo tempo, o Yandex Speech Kit e a API do Google Speech são "caixas negras" que funcionam em algum lugar muito distante nos servidores de outras pessoas e não são acessíveis para ajuste, mas o Kaldi pode ser adaptado às especificidades da tarefa em questão - vocabulário característico (profissionalismo, jargão, gíria coloquial), recursos de pronúncia etc. E tudo isso de graça e sem SMS! O sistema é um tipo de designer, que todos nós podemos usar para criar algo incomum e interessante.
Agradeço à equipe do
Yandex.Cloud , que me ajudou na implementação do
reconhecimento de caso
open_stt .
Eu trabalho no laboratório APDiMO NSU:
Site:
https://bigdata.nsu.ru/Grupo VK:
https://vk.com/lapdimo