VoiceStreamAI é um servidor baseado em Python 3 e uma solução cliente JavaScript que permite streaming e transcrição de áudio quase em tempo real usando WebSocket. O sistema emprega a Detecção de Atividade de Voz (VAD) do Huggingface e o modelo Whisper da OpenAI (sussurro mais rápido sendo o padrão) para reconhecimento e processamento de fala precisos.
Isso não irá guiá-lo em detalhes sobre como usar CUDA no docker, veja por exemplo aqui.
Ainda assim, estes são os comandos para Linux:
distribution= $( . /etc/os-release ; echo $ID$VERSION_ID )
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&& curl -s -L https://nvidia.github.io/libnvidia-container/ $distribution /libnvidia-container.list |
sed ' s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g ' |
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Você pode construir a imagem do contêiner com:
sudo docker build -t VoiceStreamAI .
Depois de obter seu token VAD (veja as próximas seções), execute:
sudo docker volume create huggingface_models
sudo docker run --gpus all -p 8765:8765 -v huggingface_models:/root/.cache/huggingface -e PYANNOTE_AUTH_TOKEN= ' VAD_TOKEN_HERE ' VoiceStreamAI
O material de "volume" permitirá que você não baixe novamente os modelos huggingface cada vez que executar novamente o contêiner. Se você não precisa disso, basta usar:
sudo docker run --gpus all -p 8765:8765 -e PYANNOTE_AUTH_TOKEN= ' VAD_TOKEN_HERE ' VoiceStreamAI
Para configurar o servidor VoiceStreamAI , você precisa do Python 3.8 ou posterior e dos seguintes pacotes:
transformers
pyannote.core
pyannote.audio
websockets
asyncio
sentence-transformers
faster-whisper
Instale estes pacotes usando pip:
pip install -r requirements.txt
Para o lado do cliente, você precisa de um navegador moderno com suporte a JavaScript.
O servidor VoiceStreamAI pode ser personalizado por meio de argumentos de linha de comando, permitindo especificar componentes, host e configurações de porta de acordo com suas necessidades.
--vad-type
: especifica o tipo de pipeline de detecção de atividade de voz (VAD) a ser usado (padrão: pyannote
).--vad-args
: uma string JSON contendo argumentos adicionais para o pipeline VAD. (obrigatório para pyannote
: '{"auth_token": "VAD_AUTH_HERE"}'
)--asr-type
: especifica o tipo de pipeline de reconhecimento automático de fala (ASR) a ser usado (padrão: faster_whisper
).--asr-args
: Uma string JSON contendo argumentos adicionais para o pipeline ASR (pode-se, por exemplo, alterar model_name
para sussurro)--host
: Define o endereço do host para o servidor WebSocket (padrão: 127.0.0.1
).--port
: Define a porta na qual o servidor escuta (padrão: 8765
).--certfile
: O caminho para o certificado SSL (arquivo cert) se estiver usando websockets seguros (padrão: None
)--keyfile
: O caminho para o arquivo de chave SSL se estiver usando websockets seguros (padrão: None
)Para executar o servidor com a configuração padrão:
python3 -m src.main --vad-args ' {"auth_token": "vad token here"} '
Você pode ver todas as opções da linha de comando com o comando:
python3 -m src.main --help
client/index.html
em um navegador da web.ws://localhost:8765
).Tanto os componentes VAD quanto os ASR podem ser facilmente estendidos para integrar novas técnicas e usar modelos com uma interface diferente dos pipelines HuggingFace. Novas estratégias de processamento/chunking podem ser adicionadas em server.py e usadas pelos clientes específicos que definem a chave "processing_strategy" na configuração.
A detecção de atividade de voz (VAD) no VoiceStreamAI permite que o sistema distinga entre segmentos de fala e não fala em um fluxo de áudio. O objetivo principal da implementação do VAD é aumentar a eficiência e a precisão do processo de conversão de fala em texto:
VoiceStreamAI usa um modelo Huggingface VAD para garantir detecção confiável de fala em diversas condições de áudio.
A estratégia de buffer foi projetada para equilibrar o processamento quase em tempo real e garantir a captura completa e precisa dos segmentos de fala. Veja como o buffer é gerenciado:
No VoiceStreamAI , cada cliente pode ter uma configuração única que adapta o processo de transcrição às suas necessidades específicas. Essa configuração personalizada é obtida por meio de um sistema de mensagens onde o cliente JavaScript envia detalhes de configuração ao servidor Python. Esta seção explica como essas configurações são estruturadas e transmitidas.
A configuração do cliente pode incluir vários parâmetros, como preferência de idioma, comprimento e deslocamento do bloco. Por exemplo:
language
: especifica o idioma para transcrição. Se definido como algo diferente de "multilíngue", forçará a inferência do Whisper a estar nesse idiomaprocessing_strategy
: especifica o tipo de processamento para este cliente, uma espécie de padrão de estratégia. A estratégia por enquanto não está usando OOP, mas é implementada em um if/else em server.pychunk_length_seconds
: Define a duração de cada pedaço de áudio a ser processadochunk_offset_seconds
: Determina o tempo de silêncio no final de cada pedaço necessário para processar o áudio (usado pelo processamento_strategy nº 1).Inicialização : Quando um cliente inicializa uma conexão com o servidor, ele pode opcionalmente enviar uma mensagem de configuração. Esta mensagem é um objeto JSON que contém pares de valores-chave que representam as configurações preferenciais do cliente.
Configuração do cliente JavaScript : no cliente de demonstração, a configuração é coletada dos elementos da interface do usuário (como menus suspensos e campos de entrada). Assim que o áudio começa a fluir, um objeto JSON é criado e enviado ao servidor via WebSocket. Por exemplo:
function sendAudioConfig ( ) {
const audioConfig = {
type : "config" ,
data : {
chunk_length_seconds : 5 ,
chunk_offset_seconds : 1 ,
processing_strategy : 1 ,
language : language ,
} ,
} ;
websocket . send ( JSON . stringify ( audioConfig ) ) ;
}
Ao implementar uma nova estratégia ASR, Vad ou Buffering, você pode testá-la com:
pip install -r requirements-dev.txt
export PYANNOTE_AUTH_TOKEN= < VAD_TOKEN_HERE >
ASR_TYPE=faster_whisper python -m unittest test.server.test_server
Certifique-se de que as variáveis finais estejam em vigor, por exemplo, para o token de autenticação VAD. Vários outros testes estão em vigor, por exemplo, para o ASR independente.
Atualmente, VoiceStreamAI processa áudio salvando pedaços em arquivos e depois executando esses arquivos nos modelos.
Bifurque e clone este repositório. Instale dependências e ferramentas relacionadas.
pip install -r requirements.txt
pip install -r requirements-dev.txt
npm install -g [email protected] [email protected]
Adicione suas modificações ao repositório e execute verificações de estilo de código manualmente ou integre-as ao seu IDE/editor.
# For Python
flake8 src/ test/
black --line-length 79 src/ test/
isort src/ test/
# For JavaScript
jshint client/ * .js
eslint client/ * .js
Por fim, faça push e crie uma solicitação pull.
Este projeto está aberto para contribuições. Sinta-se à vontade para bifurcar o repositório e enviar solicitações pull.