Pular para o conteúdo principal

Crie um sistema de despertar visual e reconhecimento de fala offline com reCamera Pro

Introdução

Este projeto implementa um fluxo de interação natural e totalmente no dispositivo para a reCamera Pro (RV1126B). A câmera detecta um rosto e estima a pose da cabeça. Somente depois que uma pessoa olha para a câmera de forma contínua o aplicativo abre o microfone e inicia o reconhecimento de fala em streaming. Em seguida, ele entra em um breve período de resfriamento para evitar disparos repetidos.

Ele é adequado para assistentes de voz, quiosques de exposição e pontos de entrada de voz na borda com foco em privacidade. Visão, avaliação de pose, extração de características de fala e inferência Zipformer são executadas localmente. O painel web não requer serviço em nuvem, processo Node.js, CDN nem fonte externa.

O código-fonte e versões futuras estão disponíveis no repositório recamera_pro_face_stt no GitHub. O repositório conterá o projeto completo depois que este diretório for enviado.

Recursos e pipeline

GStreamer camera
-> SCRFD face detection (RKNN)
-> IoU tracking + PFLD 98-point landmarks (RKNN)
-> OpenCV solvePnP head-pose estimation
-> EMA smoothing, hysteresis, and continuous-look timer
-> visual-wake event
-> bilingual streaming Zipformer STT (RKNN)

Os estados padrão são IDLE, FACE_DETECTED, ATTENTION_PENDING, LISTENING e COOLDOWN. Um olhar é aceito quando o valor absoluto de yaw é de no máximo 18° e o valor absoluto de pitch é de no máximo 13°. Manter essa pose por 700 ms aciona LISTENING. A captura de áudio começa apenas no estado de escuta, portanto o aplicativo não grava continuamente.

Requisitos de hardware

  • Uma reCamera Pro (RV1126B, aarch64)
  • Um computador que possa alcançar o dispositivo por meio de Ethernet virtual via USB ou uma LAN
  • Um SDK funcional da reCamera Pro
  • Elementos GStreamer do firmware: appsrc, videoconvert, jpegenc e rtpjpegpay
  • O dispositivo de áudio PCM ai_asr fornecido pelo firmware
nota

A entrada de áudio padrão é ai_asr: 16 kHz, S16_LE, quatro canais, canal 0 selecionado. Isso evita competir com o processo do fornecedor que possui hw:0,0.

Obter o projeto

Depois que o projeto for publicado, clone-o no host de desenvolvimento:

git clone https://github.com/yyling0101-a11y/recamera_pro_face_stt.git
cd recamera_pro_face_stt

O repositório contém modelos de visão, modelos Zipformer, o painel web e o script de cross-build. Não misture versões arbitrárias do RKNN Runtime: este projeto usa RKNN 2.3.2 e tem como alvo rv1126b.

Compilar e implantar

1. Configurar o SDK da reCamera Pro

O script de compilação procura o SDK em /home/yylin/recamera_pro/recamera-pro-sdk por padrão. Defina esta variável quando o seu estiver em outro lugar:

export RECAMERA_PRO_SDK=/absolute/path/to/recamera-pro-sdk

scripts/build_recamera.sh também valida librknnrt.so. Se o seu SDK ou runtime usar outro local, atualize qualified_rknnrt no script para um runtime RKNN 2.3.2 verificado, mantendo a etapa de validação por checksum.

2. Cross-compilar

A partir da raiz do projeto, execute:

bash scripts/build_recamera.sh

O script valida o SDK, carrega seu ambiente de compilação e cria build-recamera/deploy/:

deploy/
├── visual_wake_app
├── models/
│ ├── scrfd_500m_640_fp16.rknn
│ ├── pfld_98_112_fp16.rknn
│ └── stt/ # encoder, decoder, joiner, and vocabulary
└── web/dashboard.html

3. Copiar o pacote de implantação para o dispositivo

Copie o conteúdo do diretório de implantação para um diretório na reCamera Pro. Para um dispositivo em 192.168.42.1:

scp -r build-recamera/deploy/* [email protected]:/userdata/visual-wake/
ssh [email protected]
cd /userdata/visual-wake
chmod +x visual_wake_app
dica

Mantenha os diretórios models/ e web/ nos caminhos relativos mostrados. O aplicativo usa esses caminhos relativos padrão para carregar seus recursos.

Executar o aplicativo

Execute o aplicativo a partir de seu diretório de implantação:

./visual_wake_app

Durante a operação normal, eventos acionáveis aparecem no terminal:

VISUAL_WAKE track=1
STT_RESULT 打开灯

Opções de inicialização

Use o seguinte comando para ver todas as opções suportadas pelo executável no dispositivo:

./visual_wake_app --help

As opções podem ser combinadas. Por exemplo, este comando verifica apenas o pipeline visual e desativa os serviços de rede:

./visual_wake_app --no-stt --no-rtsp --no-web --debug

Câmera e despertar visual

OpçãoPadrãoDescrição
--detector FILEmodels/scrfd_500m_640_fp16.rknnCaminho para o modelo RKNN de detecção de rosto SCRFD.
--landmark FILEmodels/pfld_98_112_fp16.rknnCaminho para o modelo RKNN PFLD de 98 pontos de referência.
--camera DEVICE/dev/video13Dispositivo de câmera lido pelo GStreamer.
--width N1920Largura de captura de câmera solicitada.
--height N1080Altura de captura de câmera solicitada.
--fps N30Taxa de quadros da câmera solicitada; a taxa de processamento depende do tempo de inferência.
--attention-dropout-ms N250Período de tolerância, em milissegundos, para uma breve pose inválida após o início da atenção. Defina 0 para desativá-lo.
--no-sttSTT habilitadoNão iniciar o reconhecimento de fala; testar apenas a máquina de estados de despertar visual.

Reconhecimento de fala e detecção de fim de fala

OpçãoPadrãoDescrição
--stt-encoder FILEmodels/stt/encoder-epoch-99-avg-1-rv1126b.rknnCaminho do modelo de codificador Zipformer.
--stt-decoder FILEmodels/stt/decoder-epoch-99-avg-1-rv1126b.rknnCaminho do modelo de decodificador Zipformer.
--stt-joiner FILEmodels/stt/joiner-epoch-99-avg-1-rv1126b.rknnCaminho do modelo de junção Zipformer.
--stt-vocab FILEmodels/stt/vocab.txtCaminho do vocabulário. Ele deve corresponder ao conjunto de modelos selecionado.
--audio-device NAMEai_asrNome do dispositivo de áudio ALSA/arecord.
--audio-channels N4Número total de canais no PCM de entrada.
--audio-channel N0Canal a ser usado; defina -1 para fazer a média de todos os canais.
--stt-chunk-ms N160Duração de cada bloco de áudio passado para o STT, em milissegundos.
--speech-rms-threshold F0.006Limite de RMS que detecta o início da fala; aumente-o em ambientes mais ruidosos.
--stt-min-speech-ms N160Duração mínima de fala aceita em uma sessão de reconhecimento, em milissegundos.
--stt-end-silence-ms N2500Duração de silêncio que encerra o reconhecimento após o início da fala, em milissegundos.
--stt-start-timeout-ms N4000Tempo limite se a fala não começar após o despertar visual, em milissegundos.
--stt-max-ms N30000Duração máxima de uma sessão de escuta/reconhecimento, em milissegundos.

RTSP, web e exibição no terminal

OpçãoPadrãoDescrição
--no-rtspRTSP habilitadoDesativar o stream RTSP anotado com caixas de rosto, pontos de referência e pose.
--rtsp-port PORT8554Porta do servidor RTSP.
--rtsp-mount PATH/visual-wakeCaminho de montagem RTSP; por exemplo, /demo gera rtsp://DEVICE_IP:8554/demo.
--rtsp-width N960Largura de saída RTSP.
--rtsp-height N540Altura de saída RTSP.
--rtsp-fps N15Taxa de quadros de saída RTSP declarada; a taxa real depende da vazão de inferência.
--no-webServiço web habilitadoDesativar o painel HTTP e WebSocket.
--web-port PORT8080Porta para o painel web e endpoint de saúde.
--web-page PATHweb/dashboard.htmlCaminho para uma página de painel personalizada.
--dashboardDesativadoMostrar um painel no terminal interativo local. Não pode ser combinado com --debug.
--debugDesativadoImprimir logs de inicialização, por quadro de pose, nível de áudio, RTSP, contrato de tensores e desempenho de STT. Não pode ser combinado com --dashboard.

Duas maneiras de monitorar o sistema

Painel no terminal

Use --dashboard em um terminal interativo:

./visual_wake_app --dashboard

O terminal deve ter pelo menos 80×18 caracteres. O painel esquerdo mostra o status do STT, texto parcial e resultados finais; o painel direito mostra a contagem de rostos, status de estar voltado para a câmera, ângulos de pose, status do cliente RTSP e latência de visão. Pressione Ctrl-C para restaurar o terminal normal. --dashboard não pode ser combinado com --debug.

Painel web

Por padrão, o aplicativo inicia um serviço HTTP/WebSocket em todas as interfaces de rede. Abra este endereço a partir de um computador ou telefone:

http://DEVICE_IP:8080/

Para uma conexão de rede virtual via USB, por exemplo:

http://192.168.42.1:8080/

A página se conecta automaticamente a ws://DEVICE_IP:8080/ws e se reconecta após interrupções. Ela mostra transcrições parciais e finais, estado visual, contagem de rostos, yaw/pitch/roll, status do RTSP e um gráfico de latência. O endpoint de saúde é http://DEVICE_IP:8080/health. Use --web-port 8081 para outra porta ou --web-page PATH para uma página personalizada.

Ver o stream de vídeo anotado

O aplicativo inicia um servidor RTSP por padrão:

rtsp://DEVICE_IP:8554/visual-wake

No computador host, use:

ffplay -rtsp_transport tcp rtsp://192.168.42.1:8554/visual-wake

A sobreposição mostra caixas de rosto, todos os 98 pontos de referência, yaw/pitch brutos, facing=YES/NO e o estado atual. Verde significa que a pose está dentro dos limites de entrada, laranja significa que é válida mas está fora dos limites, e vermelho significa que a pose é inválida.

Ajustes finos

A posição da câmera, as características da lente e o ruído do ambiente afetam a experiência. Faça os ajustes nesta ordem:

  1. Use --debug para observar yaw/pitch enquanto estiver de frente para a câmera e, em seguida, ajuste os limites de entrada.
  2. Ajuste --attention-dropout-ms para breves oclusões; use 0 para desativar o período de tolerância.
  3. Observe o RMS de áudio no ambiente-alvo e ajuste --speech-rms-threshold.
  4. Use --stt-end-silence-ms, --stt-start-timeout-ms e --stt-max-ms para equilibrar a capacidade de resposta em relação a comandos mais longos.

O controlador usa suavização EMA e histerese de entrada/saída. Uma única pose inválida nunca aciona a escuta e não limpa imediatamente um temporizador de atenção ativo, enquanto a perda de rastreamento de rosto redefine o estado imediatamente.

Solução de problemas

ProblemaCausa provávelSolução
A compilação não encontra OpenCV ou RKNNAmbiente do SDK ausente ou runtime incompatívelVerifique RECAMERA_PRO_SDK, carregue o env.sh do SDK e use RKNN 2.3.2.
Os arquivos de modelo não podem ser encontradosLayout de implantação não foi preservadoConfirme que models/ e web/dashboard.html existem no diretório de execução.
O despertar visual nunca é acionadoCâmera incorreta, limites rigorosos ou rosto pequenoUse --debug e a sobreposição RTSP para verificar /dev/video13, pontos de referência e yaw/pitch.
STT relata um erro de áudioai_asr não está disponível ou seu formato é diferenteNo dispositivo, teste arecord -D ai_asr -f S16_LE -r 16000 -c 4 -d 5 /tmp/test.wav.
Página web indisponívelPorta inacessível ou serviço web desativadoNão use --no-web; teste http://DEVICE_IP:8080/health.
RTSP não pode ser reproduzidoProblema de rede, porta ou plugin do GStreamerUse reprodução TCP e verifique os elementos GStreamer de firmware necessários.

Suporte técnico e discussão sobre o produto

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes níveis de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...