SOUND / Zipformer

Zipformer

reComputer RK3588

Reconocimiento de voz bilingüe chino-inglés en streaming con Zipformer y RKNN en reComputer RK3576 y RK3588.

18 descargas
Precisión
RKNN

Elige el dispositivo que estás usando. La guía de configuración y la documentación se actualizarán en consecuencia.

Primeros pasos

Armbian 26.8.7 Gnome o posterior con OTA overlayroot: Configura el almacenamiento de Docker antes de ejecutar contenedores para evitar errores de montaje de overlay.

Desplegar
sudo docker run --rm --privileged --net=host \
  -e PYTHONUNBUFFERED=1 -e RKNN_LOG_LEVEL=0 \
  -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
  ghcr.io/seeed-projects/recomputer-rk-cv/rk3588-zipformer:latest

API REST

Usa la API REST para ejecutar inferencia. Copia los comandos siguientes.

Curl
curl http://localhost:8080/v1/chat/completions -d '{
  "model": "zipformer-rknn",
  "messages": [{"role": "user", "content": "Hello"}]
}'
Python
import requests

resp = requests.post(
    "http://localhost:8080/v1/chat/completions",
    json={"model": "zipformer-rknn", "messages": [{"role": "user", "content": "Hello"}]},
)
print(resp.json())

Detalles del modelo

Armbian 26.8.7 Gnome o posterior con OTA overlayroot: Configura el almacenamiento de Docker antes de ejecutar contenedores para evitar errores de montaje de overlay.

Inicio rápido

1. Instalar Docker

Ejecute los siguientes comandos en la placa de desarrollo para instalar Docker:

bash
# Download installation script
curl -fsSL https://get.docker.com -o get-docker.sh
# Install using Aliyun mirror source
sudo sh get-docker.sh --mirror Aliyun
# Start Docker and enable auto-start on boot
sudo systemctl enable docker
sudo systemctl start docker

2. Ejecutar el proyecto (un comando, vista previa de dos modos)

Este proyecto proporciona reconocimiento de voz en chino e inglés. La interfaz web admite transcripción completa de archivos cargados y transcripción en streaming del micrófono del navegador con resultados parciales.

Paso A: descargar las imágenes

bash
sudo docker pull ghcr.io/Seeed-Projects/recomputer-rk-cv/rk3588-zipformer:latest
sudo docker pull ghcr.io/Seeed-Projects/recomputer-rk-cv/rk3576-zipformer:latest

Paso B: ejecutar con un solo comando

Para RK3588:

bash
sudo docker run --rm --privileged --net=host \
    -e PYTHONUNBUFFERED=1 \
    -e RKNN_LOG_LEVEL=0 \
    -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
    ghcr.io/seeed-projects/recomputer-rk-cv/rk3588-zipformer:latest

Acceda mediante: http://<Board_IP>:8000


Para RK3576:

bash
sudo docker run --rm --privileged --net=host \
    -e PYTHONUNBUFFERED=1 \
    -e RKNN_LOG_LEVEL=0 \
    -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
    ghcr.io/seeed-projects/recomputer-rk-cv/rk3576-zipformer:latest

Acceda mediante: http://<Board_IP>:8000

El navegador envía PCM del micrófono mediante WebSocket, por lo que no se requiere mapear /dev/snd del host.

3. Inferencia por línea de comandos

bash
python inference.py --platform rk3576 --model_dir model \
    --file samples/test.wav

Use --platform rk3588 al ejecutar el directorio fuente de RK3588.


🔌 Documentación de la API

El servicio proporciona una interfaz REST para transcripción completa de archivos y una interfaz WebSocket para PCM en streaming. OpenAPI documenta las rutas REST en http://<Board_IP>:8000/docs.

1. Interfaz de transcripción de archivos

Punto de acceso: POST /api/models/zipformer/predict

Parámetros de la solicitud (Multipart/Form-Data):

  • file: Archivo de audio obligatorio. El servicio decodifica el archivo y lo remuestrea a 16 kHz antes de la inferencia. El límite de carga es 64 MB.

Ejemplo de uso:

bash
curl -X POST "http://127.0.0.1:8000/api/models/zipformer/predict" \
    -F 'file=@samples/test.wav'

Formato de respuesta (JSON):

json
{
  "success": true,
  "model": "zipformer",
  "platform": "rk3576",
  "inference_time_ms": 164.3,
  "result": {
    "text": "example transcript",
    "tokens": [12, 34],
    "timestamps": [3, 8],
    "audio_duration_seconds": 2.4,
    "processed": true
  }
}

2. Interfaz de transcripción en streaming

Punto de acceso: WS /api/models/zipformer/stream

Envíe PCM mono de 16 kHz, con signo, de 16 bits y little-endian como mensajes WebSocket binarios. Cuando termine la captura, envíe:

json
{"action":"stop"}

Envíe {"action":"reset"} para descartar la sesión de streaming actual y comenzar de nuevo. Los mensajes del servidor usan estos tipos:

  • ready: La sesión está lista e informa de sample_rate: 16000 y format: pcm_s16le.
  • partial: Contiene un resultado actualizado tras procesar suficiente audio.
  • final: Contiene el resultado completo tras la acción stop.
  • error: Informa de tramas PCM no válidas o de un fallo en tiempo de ejecución.

3. Estado y configuración del sistema

  • Punto de acceso de salud: GET /api/health
  • Punto de acceso de configuración: GET /api/config
  • Respuesta de configuración actual: {} porque Zipformer no tiene ajustes modificables durante la ejecución.

Se rechazan los datos no vacíos enviados a POST /api/config. El codificador, el decodificador, el joiner y el vocabulario se cargan juntos al iniciar el servicio.


🛠️ Guía para desarrolladores (recomendaciones de producción)

Descripción del código

  • web_service.py:
    • API REST: Decodifica el audio cargado y devuelve una transcripción completa.
    • API WebSocket: Mantiene sesiones de streaming y emite mensajes ready, partial, final y error.
  • task_runtime.py:
    • Procesamiento de audio: Crea características de bancos de filtros compatibles con Kaldi para audio mono de 16 kHz.
    • Estado de streaming: Conserva las cachés del codificador, el historial de tokens y las marcas de tiempo entre fragmentos.
    • Inferencia RKNN: Ejecuta la canalización del codificador, decodificador y joiner.
  • inference.py: Proporciona transcripción de archivos de una sola ejecución por línea de comandos.

Archivos del modelo

ComponenteArchivo
Codificadormodel/encoder.rknn
Decodificadormodel/decoder.rknn
Joinermodel/joiner.rknn
Vocabulario bilingüemodel/vocab.txt

Modificar los modelos

  1. Coloque los modelos convertidos del codificador, decodificador y joiner en model/ con los nombres de archivo indicados arriba.
  2. Mantenga los tres archivos RKNN alineados con el mismo vocabulario y contrato de caché de streaming.
  3. Verifique tanto la inferencia de archivos completos como el streaming WebSocket de PCM binario.

Estos archivos son etapas de una canalización Zipformer, no tamaños de modelo alternativos. Actualmente, el proyecto original proporciona un paquete por plataforma y ningún selector independiente de cuantización.

Crear imágenes locales

Ejecute desde la raíz de reComputer-RK-CV:

bash
docker build -f docker/rk3576/zipformer.dockerfile \
    -t rk3576-zipformer:local src/rk3576_zipformer

docker build -f docker/rk3588/zipformer.dockerfile \
    -t rk3588-zipformer:local src/rk3588_zipformer

Entradas y salidas

Entrada: archivos de audio o PCM mono de 16 kHz, 16 bits con signo y little-endian. Salida: texto chino-inglés, IDs de tokens, marcas de tiempo y duración procesada.