Saltar al contenido principal

Crea un sistema de activación visual y reconocimiento de voz sin conexión con reCamera Pro

Introducción

Este proyecto implementa un flujo de interacción natural y totalmente en el dispositivo para reCamera Pro (RV1126B). La cámara detecta un rostro y estima la pose de la cabeza. Solo después de que una persona haya mirado a la cámara de forma continua, la aplicación abre el micrófono y comienza el reconocimiento de voz en streaming. Luego entra en un breve periodo de enfriamiento para evitar activaciones repetidas.

Es adecuado para asistentes de voz, quioscos de exposición y puntos de entrada de voz en el borde con prioridad a la privacidad. La visión, la evaluación de la pose, las características de voz y la inferencia Zipformer se ejecutan localmente. El panel web no requiere ningún servicio en la nube, proceso de Node.js, CDN ni fuente externa.

El código fuente y las futuras versiones están disponibles en el repositorio de GitHub recamera_pro_face_stt. El repositorio contendrá el proyecto completo después de que se envíe este directorio.

Funciones y flujo de procesamiento

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)

Los estados predeterminados son IDLE, FACE_DETECTED, ATTENTION_PENDING, LISTENING y COOLDOWN. Se acepta una mirada cuando el valor absoluto del yaw es como máximo 18° y el valor absoluto del pitch es como máximo 13°. Mantener esa pose durante 700 ms activa LISTENING. La captura de audio solo comienza en el estado de escucha, por lo que la aplicación no graba de forma continua.

Requisitos de hardware

  • Una reCamera Pro (RV1126B, aarch64)
  • Un ordenador que pueda alcanzar el dispositivo mediante Ethernet virtual por USB o una LAN
  • Un SDK de reCamera Pro funcional
  • Elementos de GStreamer del firmware: appsrc, videoconvert, jpegenc y rtpjpegpay
  • El dispositivo de audio PCM ai_asr proporcionado por el firmware
nota

La entrada de audio predeterminada es ai_asr: 16 kHz, S16_LE, cuatro canales, canal 0 seleccionado. Esto evita competir con el proceso del proveedor que posee hw:0,0.

Obtener el proyecto

Después de que se publique el proyecto, clónalo en el host de desarrollo:

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

El repositorio contiene modelos de visión, modelos Zipformer, el panel web y el script de compilación cruzada. No mezcles versiones arbitrarias de RKNN Runtime: este proyecto usa RKNN 2.3.2 y tiene como destino rv1126b.

Compilar y desplegar

1. Configurar el SDK de reCamera Pro

El script de compilación busca el SDK en /home/yylin/recamera_pro/recamera-pro-sdk de forma predeterminada. Define esta variable cuando el tuyo esté en otro lugar:

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

scripts/build_recamera.sh también valida librknnrt.so. Si tu SDK o runtime usa otra ubicación, actualiza qualified_rknnrt en el script a un runtime RKNN 2.3.2 verificado, manteniendo el paso de validación de checksum.

2. Compilación cruzada

Desde la raíz del proyecto, ejecuta:

bash scripts/build_recamera.sh

El script valida el SDK, carga su entorno de compilación y crea 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 el paquete de despliegue al dispositivo

Copia el contenido del directorio de despliegue en un único directorio de reCamera Pro. Para un dispositivo en 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
tip

Mantén los directorios models/ y web/ en las rutas relativas mostradas. La aplicación usa esas rutas relativas predeterminadas para cargar sus recursos.

Ejecutar la aplicación

Ejecuta la aplicación desde su directorio de despliegue:

./visual_wake_app

Durante el funcionamiento normal, los eventos relevantes aparecen en la terminal:

VISUAL_WAKE track=1
STT_RESULT 打开灯

Opciones de lanzamiento

Usa el siguiente comando para ver todas las opciones que admite el ejecutable en el dispositivo:

./visual_wake_app --help

Las opciones se pueden combinar. Por ejemplo, este comando solo verifica el flujo de procesamiento visual y desactiva los servicios de red:

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

Cámara y activación visual

OpciónPredeterminadoDescripción
--detector FILEmodels/scrfd_500m_640_fp16.rknnRuta al modelo RKNN de detección de rostros SCRFD.
--landmark FILEmodels/pfld_98_112_fp16.rknnRuta al modelo RKNN de 98 puntos de referencia PFLD.
--camera DEVICE/dev/video13Dispositivo de cámara leído por GStreamer.
--width N1920Ancho de captura de cámara solicitado.
--height N1080Altura de captura de cámara solicitada.
--fps N30Velocidad de fotogramas de cámara solicitada; la velocidad de procesamiento depende del tiempo de inferencia.
--attention-dropout-ms N250Periodo de gracia, en milisegundos, para una breve pose no válida después de que comience la atención. Establece 0 para desactivarlo.
--no-sttSTT habilitadoNo iniciar el reconocimiento de voz; probar solo la máquina de estados de activación visual.

Reconocimiento de voz y detección de final de habla

OpciónPredeterminadoDescripción
--stt-encoder FILEmodels/stt/encoder-epoch-99-avg-1-rv1126b.rknnRuta al modelo de codificador Zipformer.
--stt-decoder FILEmodels/stt/decoder-epoch-99-avg-1-rv1126b.rknnRuta al modelo de decodificador Zipformer.
--stt-joiner FILEmodels/stt/joiner-epoch-99-avg-1-rv1126b.rknnRuta al modelo de unión Zipformer.
--stt-vocab FILEmodels/stt/vocab.txtRuta del vocabulario. Debe coincidir con el conjunto de modelos seleccionado.
--audio-device NAMEai_asrNombre del dispositivo de audio ALSA/arecord.
--audio-channels N4Número total de canales en el PCM de entrada.
--audio-channel N0Canal que se va a usar; establece -1 para promediar todos los canales.
--stt-chunk-ms N160Duración de cada fragmento de audio pasado a STT, en milisegundos.
--speech-rms-threshold F0.006Umbral RMS que detecta el inicio del habla; auméntalo en salas más ruidosas.
--stt-min-speech-ms N160Duración mínima de habla aceptada en una sesión de reconocimiento, en milisegundos.
--stt-end-silence-ms N2500Duración de silencio que finaliza el reconocimiento después de que comience el habla, en milisegundos.
--stt-start-timeout-ms N4000Tiempo de espera si el habla no comienza después de la activación visual, en milisegundos.
--stt-max-ms N30000Duración máxima de una sesión de escucha/reconocimiento, en milisegundos.

RTSP, web y visualización en terminal

OpciónPredeterminadoDescripción
--no-rtspRTSP habilitadoDesactivar el flujo RTSP anotado con cajas de rostro, puntos de referencia y pose.
--rtsp-port PORT8554Puerto del servidor RTSP.
--rtsp-mount PATH/visual-wakeRuta de montaje RTSP; por ejemplo, /demo da rtsp://DEVICE_IP:8554/demo.
--rtsp-width N960Ancho de salida RTSP.
--rtsp-height N540Altura de salida RTSP.
--rtsp-fps N15Velocidad de fotogramas de salida RTSP declarada; la velocidad real depende del rendimiento de inferencia.
--no-webServicio web habilitadoDesactivar el panel HTTP y WebSocket.
--web-port PORT8080Puerto para el panel web y el endpoint de estado.
--web-page PATHweb/dashboard.htmlRuta a una página de panel personalizada.
--dashboardOffMostrar un panel en la terminal interactiva local. No se puede combinar con --debug.
--debugOffImprimir registros de inicio, por fotograma de pose, nivel de audio, RTSP, contrato de tensores y rendimiento de STT. No se puede combinar con --dashboard.

Dos formas de monitorizar el sistema

Panel en terminal

Usa --dashboard en una terminal interactiva:

./visual_wake_app --dashboard

La terminal debe tener al menos 80×18 caracteres. El panel izquierdo muestra el estado de STT, texto parcial y resultados finales; el panel derecho muestra el recuento de rostros, el estado de orientación hacia la cámara, los ángulos de pose, el estado de los clientes RTSP y la latencia de visión. Pulsa Ctrl-C para restaurar la terminal normal. --dashboard no se puede combinar con --debug.

Panel web

De forma predeterminada, la aplicación inicia un servicio HTTP/WebSocket en cada interfaz de red. Abre esta dirección desde un ordenador o teléfono:

http://DEVICE_IP:8080/

Para una conexión de red virtual por USB, por ejemplo:

http://192.168.42.1:8080/

La página se conecta automáticamente a ws://DEVICE_IP:8080/ws y se reconecta tras las interrupciones. Muestra transcripciones parciales y finales, estado visual, recuento de rostros, yaw/pitch/roll, estado de RTSP y un gráfico de latencia. El endpoint de estado es http://DEVICE_IP:8080/health. Usa --web-port 8081 para otro puerto, o --web-page PATH para una página personalizada.

Ver el flujo de vídeo anotado

La aplicación inicia un servidor RTSP de forma predeterminada:

rtsp://DEVICE_IP:8554/visual-wake

En el ordenador host, usa:

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

La superposición muestra cajas de rostro, los 98 puntos de referencia, yaw/pitch sin procesar, facing=YES/NO y el estado actual. El verde significa que la pose está dentro de los umbrales de entrada, el naranja significa que es válida pero está fuera de los umbrales, y el rojo significa que la pose no es válida.

Ajuste fino

La colocación de la cámara, las características de la lente y el ruido de la sala afectan a la experiencia. Ajusta en este orden:

  1. Usa --debug para observar yaw/pitch mientras miras a la cámara y luego ajusta los umbrales de entrada.
  2. Ajusta --attention-dropout-ms para oclusiones breves; usa 0 para desactivar el periodo de gracia.
  3. Observa el RMS de audio en el entorno objetivo y ajusta --speech-rms-threshold.
  4. Usa --stt-end-silence-ms, --stt-start-timeout-ms y --stt-max-ms para equilibrar la capacidad de respuesta frente a comandos más largos.

El controlador utiliza suavizado EMA e histéresis de entrada/salida. Una sola pose no válida nunca activa la escucha y no borra inmediatamente un temporizador de atención activo, mientras que la pérdida de seguimiento de la cara restablece el estado de inmediato.

Solución de problemas

ProblemaCausa probableSolución
La compilación no puede encontrar OpenCV o RKNNFalta el entorno del SDK o el runtime es incompatibleVerifica RECAMERA_PRO_SDK, carga el env.sh del SDK y usa RKNN 2.3.2.
No se pueden encontrar los archivos del modeloNo se conservó la estructura de despliegueConfirma que models/ y web/dashboard.html existan en el directorio de ejecución.
El despertar visual nunca se activaCámara incorrecta, umbrales estrictos o cara pequeñaUsa --debug y la superposición RTSP para comprobar /dev/video13, los puntos de referencia y el cabeceo/giro.
STT informa un error de audioai_asr no está disponible o su formato es diferenteEn el dispositivo, prueba arecord -D ai_asr -f S16_LE -r 16000 -c 4 -d 5 /tmp/test.wav.
La página web no está disponibleEl puerto es inaccesible o el servicio web fue deshabilitadoNo uses --no-web; prueba http://DEVICE_IP:8080/health.
No se puede reproducir RTSPProblema de red, puerto o plugin de GStreamerUsa reproducción TCP y verifica los elementos de GStreamer de firmware requeridos.

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte distintos niveles de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos múltiples canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...