Este é o PocketSphinx, um dos motores de reconhecimento de fala contínuo de grande vocabulário e independente do locutor da Universidade Carnegie Mellon.
Embora este tenha sido em determinado momento um sistema de investigação, o desenvolvimento activo cessou em grande parte e tornou-se muito, muito distante do estado da arte. Estou fazendo um lançamento porque as pessoas ainda o usam e há uma série de erros históricos no sistema de compilação e na API que precisam ser corrigidos.
O número da versão é estranhamente grande porque houve um "lançamento" que as pessoas estão usando, chamado 5prealpha, e usaremos o versionamento semântico adequado de agora em diante.
Consulte o arquivo LICENSE para obter os termos de uso.
Agora usamos CMake para construção, o que deve fornecer resultados razoáveis em Linux e Windows. Não tenho certeza sobre o Mac OS X porque não tenho um desses. Além disso, a biblioteca de áudio, que nunca foi construída ou funcionou corretamente em nenhuma plataforma, foi simplesmente removida.
Não há mais dependência do SphinxBase. Não existe mais SphinxBase. Este não é o SphinxBase que você está procurando. Todas as suas SphinxBase pertencem a nós.
Para instalar o módulo Python em um ambiente virtual (substitua ~/ve_pocketsphinx
pelo ambiente virtual que você deseja criar), no diretório de nível superior:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
Para instalar a biblioteca C e as ligações (supondo que você tenha acesso a /usr/local - caso contrário, use -DCMAKE_INSTALL_PREFIX
para definir um prefixo diferente no primeiro comando cmake
abaixo):
cmake -S . -B build cmake --build build cmake --build build --target install
O programa de linha de comando pocketsphinx
lê áudio PCM de canal único de 16 bits da entrada padrão ou de um ou mais arquivos e tenta reconhecer a fala nele usando o modelo acústico e de linguagem padrão. Ele aceita um grande número de opções com as quais você provavelmente não se importa, um comando cujo padrão é live
e uma ou mais entradas (exceto no modo de align
) ou -
para ler a entrada padrão.
Se você tiver um arquivo WAV de canal único chamado "speech.wav" e quiser reconhecer a fala nele, você pode tentar fazer isso (os resultados podem não ser maravilhosos):
pocketsphinx single speech.wav
Se sua entrada estiver em algum outro formato, sugiro convertê-la com sox
conforme descrito abaixo.
Os comandos são os seguintes:
help
: Imprima uma longa lista das opções que você não gosta.
config
: despeja a configuração como JSON na saída padrão (pode ser carregada com a opção -config
).
live
: detecte segmentos de fala em cada entrada, execute o reconhecimento neles (usando as opções com as quais você não se importa) e grave os resultados na saída padrão em JSON delimitado por linhas. Sei que este não é o formato mais bonito, mas com certeza supera o XML. Cada linha contém um objeto JSON com estes campos, que possuem nomes curtos para tornar as linhas mais legíveis:
b
: Hora de início em segundos, desde o início do stream
d
: Duração em segundos
p
: Probabilidade estimada do resultado do reconhecimento, ou seja, um número entre 0 e 1 representando a probabilidade do input de acordo com o modelo
t
: Texto completo do resultado do reconhecimento
w
: Lista de segmentos (geralmente palavras), cada um dos quais contém os campos b
, d
, p
e t
, para início, fim, probabilidade e o texto da palavra. Se -phone_align yes
tiver sido passado, então um campo w
estará presente contendo segmentações de telefone, no mesmo formato.
single
: reconheça cada entrada como uma única expressão e escreva um objeto JSON no mesmo formato descrito acima.
align
: Alinhe um único arquivo de entrada (ou -
para entrada padrão) a uma sequência de palavras e escreva um objeto JSON no mesmo formato descrito acima. O primeiro argumento posicional é a entrada, e todos os subsequentes são concatenados para formar o texto, para evitar surpresas caso você esqueça de citá-lo. Você é responsável por normalizar o texto para remover pontuação, letras maiúsculas, centopéias, etc.
pocketsphinx align goforward.wav "go forward ten meters"
Por padrão, apenas o alinhamento em nível de palavra é feito. Para obter alinhamentos de telefone, passe -phone_align yes
nas flags, por exemplo:
pocketsphinx -phone_align yes align audio.wav $text
Isso não produzirá uma saída particularmente legível, mas você pode usar jq para limpá-la. Por exemplo, você pode obter apenas os nomes das palavras e horários de início como este:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
Ou você pode obter os nomes dos telefones e durações assim:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
Existem muitas, muitas outras possibilidades, é claro.
soxflags
: Retorna argumentos para sox
que criará o formato de entrada apropriado. Observe que, como a linha de comando sox
é um pouco peculiar, ela deve sempre vir depois do nome do arquivo ou -d
(que diz sox
para ler no microfone). Você pode executar o reconhecimento ao vivo assim:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
ou decodifique de um arquivo chamado "audio.mp3" assim:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
Por padrão apenas os erros são impressos no erro padrão, mas se quiser mais informações pode passar -loglevel INFO
. Os resultados parciais não são impressos, talvez o sejam no futuro, mas não prenda a respiração.
Para programação, consulte o diretório de exemplos para obter vários exemplos de uso da biblioteca de C e Python. Você também pode ler a documentação da API Python ou da API C
Em última análise, o PocketSphinx é baseado no Sphinx-II
, que por sua vez foi baseado em alguns sistemas mais antigos da Carnegie Mellon University, que foram lançados como software livre sob uma licença semelhante ao BSD, graças aos esforços de Kevin Lenzo. Grande parte do decodificador em particular foi escrito por Ravishankar Mosur (procure "rkm" nos comentários), mas várias outras pessoas também contribuíram, consulte o arquivo AUTHORS para mais detalhes.
David Huggins-Daines (o autor deste documento) é responsável pela criação PocketSphinx
que adicionou várias otimizações de velocidade e memória, computação de ponto fixo, suporte JSGF, portabilidade para várias plataformas e uma API um tanto coerente. Ele então desapareceu por um tempo.
Nickolay Shmyrev assumiu a manutenção por um bom tempo depois, e muito código foi contribuído por Alexander Solovets, Vyacheslav Klimkov e outros.
Atualmente isso é mantido novamente por David Huggins-Daines.