SOUND / Zipformer
Zipformer
reComputer RK3588
Reconocimiento de voz bilingüe chino-inglés en streaming con Zipformer y RKNN en reComputer RK3576 y RK3588.
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.
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:latestAPI REST
Usa la API REST para ejecutar inferencia. Copia los comandos siguientes.
curl http://localhost:8080/v1/chat/completions -d '{
"model": "zipformer-rknn",
"messages": [{"role": "user", "content": "Hello"}]
}'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:
# 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 docker2. 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
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:latestPaso B: ejecutar con un solo comando
Para RK3588:
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:latestAcceda mediante: http://<Board_IP>:8000
Para RK3576:
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:latestAcceda 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
python inference.py --platform rk3576 --model_dir model \
--file samples/test.wavUse --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:
curl -X POST "http://127.0.0.1:8000/api/models/zipformer/predict" \
-F 'file=@samples/test.wav'Formato de respuesta (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:
{"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 desample_rate: 16000yformat: pcm_s16le.partial: Contiene un resultado actualizado tras procesar suficiente audio.final: Contiene el resultado completo tras la acciónstop.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
| Componente | Archivo |
|---|---|
| Codificador | model/encoder.rknn |
| Decodificador | model/decoder.rknn |
| Joiner | model/joiner.rknn |
| Vocabulario bilingüe | model/vocab.txt |
Modificar los modelos
- Coloque los modelos convertidos del codificador, decodificador y joiner en
model/con los nombres de archivo indicados arriba. - Mantenga los tres archivos RKNN alineados con el mismo vocabulario y contrato de caché de streaming.
- 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:
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_zipformerEntradas 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.