Implementación de reconocimiento de voz local Whisper NAS: tutorial de transliteración de susurros más rápido

Tutorial práctico sobre la implementación del reconocimiento de voz Whisper localmente en NAS: utilice el susurro más rápido para transcribir audio y video, seleccione el modelo pequeño/base/pequeño/mediano, salida TXT/SRT, configure el filtrado VAD, el tipo de cálculo de CPU/GPU y maneje la transcripción por lotes y los límites de privacidad.

El escenario más adecuado para implementar Whisper en NAS no es buscar “subtítulos de conferencias en tiempo real”, sino colocar videos caseros, entrevistas, grabaciones de cursos, podcasts y archivos de conferencias en un directorio privado para generar transcripciones y subtítulos SRT a pedido o en lotes.

Para la mayoría de los NAS, se recomienda comenzar con faster-whisper. Utiliza el motor de inferencia CTranslate2, puede usar CPU o GPU CUDA y admite cuantificación, filtrado de silencio VAD y marca de tiempo a nivel de palabra. Primero utilice un modelo pequeño para ejecutar el proceso y luego decida si desea actualizar el modelo en función de la precisión y el tiempo de espera.

Hablemos primero de la conclusión.

La ruta más segura hacia el reconocimiento de voz local de NAS es:

1
2
3
4
5
6
准备输入 / 输出目录
-> 安装 ffmpeg 与 faster-whisper
-> 用短音频跑 small 或 base
-> 检查 TXT 和 SRT
-> 开启 VAD 过滤
-> 再做批量任务、GPU 加速或 Docker 封装

Los NAS sin gráficos discretos también pueden transcribir, pero deben tratarse como una tarea fuera de línea. Si desea transcribir vídeos largos con frecuencia, grabar a varias personas o buscar una respuesta más rápida, la función de la GPU suele ser más obvia que simplemente aumentar la capacidad del disco duro.

Cómo elegir un modelo

Whisper viene en modelos de diferentes tamaños. Los modelos más grandes generalmente son mejores para manejar acentos, ruido y contexto complejo, pero tienen inferencias más lentas y mayores requisitos de memoria.

Modelo Sugerencias sobre NAS Adecuado para la escena
tiny / base Proceso de prueba, NAS de bajo consumo Audio corto claro, vista previa rápida
small El punto de partida para la mayoría de los NAS domésticos Conferencias generales de chino, cursos y subtítulos de vídeos.
medium La CPU NAS suele ser más lenta; inténtalo de nuevo si tienes una GPU Audio con más ruido y jerga
large-v3 / turbo Más adecuado para hosts GPU con suficiente memoria de vídeo Transcripción sin conexión de alta calidad, procesamiento por lotes de audio largo

No juzgues el efecto sólo por el nombre del modelo. La claridad de la grabación, la superposición de los oradores, la música de fondo, la distancia del micrófono y los nombres propios a menudo afectan la transcripción final más que pasar de small a un modelo más grande.

Planificación de directorios: entrada, salida y caché de modelo separados

Tome el NAS de Linux como ejemplo:

1
2
3
mkdir -p ~/asr/inbox
mkdir -p ~/asr/out
mkdir -p ~/asr/models

Acuerdo sugerido:

1
2
3
~/asr/inbox/   放 MP3、M4A、WAV、MP4 等输入文件
~/asr/out/     放 TXT、SRT、JSON 等结果
~/asr/models/  放下载的模型缓存

Las tareas por lotes tienen más miedo de mezclar entradas, salidas y caché de modelos en el mismo directorio. Después de la separación, la copia de seguridad, la limpieza y el control de permisos son más fáciles.

Entorno de instalación

En un contenedor NAS o Linux tipo Debian/Ubuntu, primero instale las herramientas básicas:

1
2
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg

Cree un entorno virtual independiente:

1
2
3
4
python3 -m venv ~/asr/.venv
source ~/asr/.venv/bin/activate
pip install --upgrade pip
pip install faster-whisper

ffmpeg se utiliza para leer formatos comunes de audio y video. Sin él, es posible que MP4, M4A o algunos formatos de codificación no se transcodifiquen ni se lean correctamente.

Guión de transliteración mínima

Escribe el siguiente código en ~/asr/transcribe.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pathlib import Path
from faster_whisper import WhisperModel

input_file = Path("/home/USER/asr/inbox/sample.mp3")
output_dir = Path("/home/USER/asr/out")
output_dir.mkdir(parents=True, exist_ok=True)

model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

segments, info = model.transcribe(
    str(input_file),
    language="zh",
    vad_filter=True,
    word_timestamps=True,
)

segments = list(segments)

lines = []
for segment in segments:
    text = segment.text.strip()
    lines.append(text)
    print(f"[{segment.start:.2f} -> {segment.end:.2f}] {text}")

(output_dir / f"{input_file.stem}.txt").write_text(
    "\n".join(lines), encoding="utf-8"
)

Cambie /home/USER en el código a su directorio de usuario real de Linux, luego ejecute:

1
2
source ~/asr/.venv/bin/activate
python ~/asr/transcribe.py

Cuando se ejecuta por primera vez, Fast-Whisper descargará el modelo correspondiente. Una vez que el modelo se haya descargado correctamente, se guardará en el download_root que especificó y no será necesario volver a descargarlo en el futuro.

Parámetros recomendados de CPU NAS

Cuando no hay GPU, se da prioridad al control del tamaño del modelo y la precisión del cálculo:

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

int8 suele ser adecuado como punto de partida para la inferencia de la CPU. Si el NAS también proporciona sincronización de archivos, indexación de fotografías, descarga o servicios multimedia, se recomienda que:

  • Comience con base o small;
  • Evite ejecutar múltiples tareas de transcripción al mismo tiempo;
  • Los vídeos largos están programados durante las horas de menor actividad;
  • Observe la memoria del sistema, la temperatura de la CPU y el intercambio;
  • No permita que el NAS realice grandes cantidades de transcodificación, verificación y transcodificación al mismo tiempo.

El objetivo de un NAS con CPU debería ser una “finalización estable” en lugar de ponerse al día con el progreso de la reproducción de audio en tiempo real.

Cómo configurar cuando hay GPU NVIDIA

Cuando su host NAS o Linux tenga una GPU NVIDIA disponible, intente:

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="float16",
    download_root="/home/USER/asr/models",
)

Cuando la memoria es escasa, puedes intentar:

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="int8_float16",
    download_root="/home/USER/asr/models",
)

El compute_type real disponible depende de CTranslate2, CUDA, controlador y GPU. Verifique primero con audio corto y luego procese archivos largos. Si lo coloca en Docker, primero debe confirmar que el contenedor puede ver la GPU; cuando nvidia-smi no está disponible en el contenedor, el transcriptor no recibirá aceleración CUDA.

¿Por qué se recomienda activar el filtrado VAD?

VAD (Detección de actividad de voz) omite segmentos que obviamente están mudos. Para grabaciones de conferencias, pausas largas, música de fondo o archivos con mucho espacio en blanco al principio y al final de la grabación, suele haber dos ventajas:

  • Reducir el tiempo de razonamiento sin sentido;
  • Reduzca la probabilidad de que los segmentos silenciosos sean reconocidos como texto irrelevante.

Habilitado en susurro más rápido:

1
2
3
4
segments, info = model.transcribe(
    "input.mp3",
    vad_filter=True,
)

Pero VAD no es un interruptor que “nunca falla”. Cuando la voz es muy suave, la música y las voces humanas se mezclan o la grabación del teléfono es intermitente, debe verificar aleatoriamente si el VAD ha cortado accidentalmente el contenido válido.

Generar subtítulos SRT

Cada segmento de Whisper tiene una hora de inicio y finalización. Se puede generar un SRT simple basado en el script anterior:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def srt_time(seconds: float) -> str:
    milliseconds = round(seconds * 1000)
    hours, milliseconds = divmod(milliseconds, 3_600_000)
    minutes, milliseconds = divmod(milliseconds, 60_000)
    seconds, milliseconds = divmod(milliseconds, 1000)
    return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"

blocks = []
for index, segment in enumerate(segments, start=1):
    blocks.append(
        f"{index}\n"
        f"{srt_time(segment.start)} --> {srt_time(segment.end)}\n"
        f"{segment.text.strip()}\n"
    )

(output_dir / f"{input_file.stem}.srt").write_text(
    "\n".join(blocks), encoding="utf-8"
)

Si desea resaltar palabra por palabra o realizar una edición más detallada, puede leer la marca de tiempo a nivel de palabra después de word_timestamps=True. Sin embargo, los resultados a nivel de palabras también requieren comprobaciones manuales al azar, especialmente una mezcla de chino e inglés, nombres de personas, lugares y abreviaturas.

No ejecute transferencias por lotes completos de una sola vez

Se recomienda procesar archivos por lotes en serie o con baja concurrencia por cola:

1
2
3
for file in ~/asr/inbox/*; do
  python ~/asr/transcribe.py "$file"
done

Se debe agregar al script real la lógica para el filtrado de extensiones, el registro de éxitos/errores y la omisión de archivos completados. Lo más importante es: procesar 5 muestras primero, confirmar que el directorio de salida, el idioma, el modelo y la línea de tiempo de los subtítulos sean correctos antes de comenzar todo el lote de tareas.

La ejecución ciega y simultánea de varias tareas de transferencia large-v3 en el NAS puede provocar fácilmente que la memoria, la memoria de la GPU o la disipación de calor se conviertan en cuellos de botella. Si el servicio de transcripción también comparte recursos con álbumes de fotos, copias de seguridad y descargadores, la cola debería ser limitada.

Cómo utilizar Docker de forma estable

Muchos NAS son más adecuados para gestionar servicios con Container Manager o Docker. Se recomienda ejecutar primero la versión de Python en el host o en un contenedor de Linux normal y luego empaquetar el contenedor. Al contenerizar, al menos:

  • Monte el directorio de entrada como de solo lectura;
  • Monte el directorio de salida por separado y con capacidad de escritura;
  • Monte el directorio de caché del modelo de forma persistente;
  • Se corrigieron las versiones de susurro más rápido, CTranslate2 y Python;
  • Si utiliza una GPU, primero verifique el tiempo de ejecución del contenedor y la transferencia del dispositivo.

No monte todo el directorio compartido del NAS en el contenedor de transcodificación en modo lectura-escritura. La tarea de reconocimiento de voz solo requiere leer audio y video y escribir los resultados del texto. Cuanto menores sean los permisos, menor será el impacto de un mal funcionamiento.

Límites de precisión y privacidad

La ventaja de la implementación local es que no es necesario cargar el audio en un servicio de terceros, pero esto no significa que la salida sea naturalmente precisa. Whisper puede escuchar mal nombres, jerga, números y segmentos silenciosos, así como texto poco confiable cuando se expone a ruido o espacios en blanco largos.

El siguiente contenido debe revisarse manualmente:

  • registros médicos, legales, financieros y de seguridad;
  • Subtítulos publicados al público;
  • Citas de entrevistas y resoluciones de reuniones;
  • Nombre, monto, fecha, número de teléfono y modelo de producto.

Conservar el audio original y tratar la transcripción como un primer borrador es un proceso más seguro que “eliminar el archivo original inmediatamente después de la transcripción”.

Un conjunto de configuraciones predeterminadas adecuadas para NAS

Si no tienes una tarjeta gráfica discreta:

1
2
3
4
5
model: base 或 small
device: cpu
compute_type: int8
vad_filter: true
并发: 1

Si tienes una GPU NVIDIA disponible:

1
2
3
4
5
model: small 起步,按效果再试 medium
device: cuda
compute_type: float16 或 int8_float16
vad_filter: true
并发: 从 1 开始压测

Primero use la misma grabación real de 10 a 30 minutos para comparar la línea de tiempo de las palabras omitidas, los errores tipográficos y los subtítulos que consumen mucho tiempo antes de decidir si actualizar el modelo. No confíe únicamente en unos segundos de muestras claras para juzgar si un NAS es adecuado para la transcripción a largo plazo.

Resumir

La implementación de Whisper NAS puede comenzar con un susurro más rápido: modelo pequeño, baja concurrencia, filtrado VAD, separación de directorios de entrada y salida. CPU NAS puede manejar transcripciones fuera de línea de baja frecuencia; El GPU NAS con un entorno CUDA correcto es más adecuado para una gran cantidad de vídeos y modelos más grandes.

Lo que realmente determina la experiencia no es “Se puede instalar Whisper”, sino la calidad del audio, el tamaño del modelo, la cola de transcodificación real y de cuántos otros servicios es responsable el NAS. Primero, reproduzca una pieza de audio real y luego amplíela.

referirse a:

记录并分享
Creado con Hugo
Tema Stack diseñado por Jimmy