faster-whisper: un motor de transcripción Whisper más rápido

faster-whisper reimplementa la inferencia de Whisper con CTranslate2, haciendo que la transcripción local y del lado del servidor sea más rápida y eficiente en memoria.

faster-whisper es una implementación de inferencia de Whisper mantenida por SYSTRAN. Usa CTranslate2 como backend, mantiene un flujo cercano a Whisper y hace que la velocidad de inferencia, el uso de memoria y la flexibilidad de despliegue sean más adecuados para trabajo de ingeniería.

Si has usado openai/whisper, puedes pensar en faster-whisper como una alternativa más orientada a producción. La interfaz sigue girando alrededor de cargar un modelo, transcribir audio y leer resultados segmentados, pero la capa de ejecución es más rápida y más fácil de ajustar para CPU, GPU, cuantización y batching.

Qué problema resuelve

Whisper funciona bien, pero la implementación original suele encontrar varios problemas cuando se despliega directamente:

  1. El audio largo puede tardar bastante en transcribirse.
  2. El uso de memoria GPU puede ser alto.
  3. La ejecución en CPU funciona, pero la velocidad puede no ser ideal.
  4. El throughput no siempre es fácil de escalar al procesar grandes lotes de audio o video.

faster-whisper optimiza principalmente estos puntos. Su README indica que, con la misma precisión, puede ser hasta 4 veces más rápido que openai/whisper usando menos memoria. Con cuantización de 8 bits, la velocidad puede mejorar aún más.

Instalación

En un entorno Python normal, instálalo directamente:

1
pip install faster-whisper

Si quieres usar GPU, asegúrate de que las versiones locales de CUDA, cuDNN y CTranslate2 sean compatibles. Este es el punto más fácil para tropezar: el código puede estar bien, pero la inferencia puede fallar al cargar el modelo o ejecutar la primera solicitud si el driver GPU y el runtime CUDA no coinciden.

Uso básico

El ejemplo mínimo es directo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from faster_whisper import WhisperModel

model_size = "large-v3"

model = WhisperModel(model_size, device="cuda", compute_type="float16")

segments, info = model.transcribe("audio.mp3", beam_size=5)

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

Los parámetros clave son:

Parámetro Propósito
model_size Selecciona el tamaño del modelo Whisper, como small, medium o large-v3
device Dispositivo de inferencia, normalmente cuda o cpu
compute_type Precisión de cálculo, como float16, int8_float16 o int8
beam_size Anchura de búsqueda de decodificación; valores mayores suelen ser más estables pero más lentos

Si tu objetivo es una transcripción local rápida, empieza probando medium o large-v3. Si la memoria GPU es limitada, considera la cuantización.

Elegir CPU o GPU

Con una GPU NVIDIA, prefiere:

1
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

Si la memoria GPU no alcanza, cambia a:

1
model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")

Sin GPU, ejecútalo en CPU:

1
model = WhisperModel("small", device="cpu", compute_type="int8")

El modo CPU encaja mejor con tareas ligeras, trabajos en segundo plano poco frecuentes o servidores sin tarjeta gráfica. Para mucho audio largo, la GPU sigue siendo la mejor opción.

Transcripción por lotes

faster-whisper también ofrece transcripción por lotes. El batching es útil para muchos audios cortos o cuando necesitas mayor throughput de GPU:

1
2
3
4
5
6
7
8
from faster_whisper import WhisperModel, BatchedInferencePipeline

model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched_model = BatchedInferencePipeline(model=model)
segments, info = batched_model.transcribe("audio.mp3", batch_size=16)

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

Un batch_size mayor no siempre es mejor. Mejora el throughput, pero también aumenta la presión sobre la memoria GPU. En la práctica, prueba valores como 4, 8 y 16 paso a paso hasta encontrar un punto estable para tu máquina.

VAD y marcas de tiempo por palabra

La transcripción de voz suele tener que lidiar con silencios largos, ruido de fondo y alineación de subtítulos. faster-whisper incluye parámetros prácticos que se pueden activar directamente durante la transcripción.

Activar VAD:

1
segments, info = model.transcribe("audio.mp3", vad_filter=True)

Obtener marcas de tiempo por palabra:

1
2
3
4
5
segments, info = model.transcribe("audio.mp3", word_timestamps=True)

for segment in segments:
    for word in segment.words:
        print("[%.2fs -> %.2fs] %s" % (word.start, word.end, word.word))

VAD es útil para grabaciones de reuniones, podcasts y repeticiones de directos con secciones largas de silencio. Las marcas de tiempo por palabra son útiles para subtítulos, revisión de transcripciones y resaltado de palabras en reproductores.

Elegir un modelo

La elección del modelo depende sobre todo de precisión, velocidad y recursos de la máquina.

Escenario Recomendación
Pruebas rápidas small o medium
Contenido chino priorizando calidad large-v3
Memoria GPU ajustada int8_float16 o un modelo más pequeño
Tareas en segundo plano con CPU Modelo pequeño más int8
Muchos audios cortos Probar BatchedInferencePipeline

Para voz en chino, empieza con large-v3 si la calidad importa. Si la máquina va demasiado justa, reduce el tamaño del modelo o usa cuantización. No mires solo la velocidad al principio: si baja la calidad de transcripción, el tiempo extra de revisión manual puede anular el tiempo de inferencia ahorrado.

Casos de uso adecuados

faster-whisper encaja bien para:

  1. Generar subtítulos de video.
  2. Transcribir podcasts, reuniones y grabaciones de cursos.
  3. Crear flujos locales de transcripción para Bilibili, YouTube y videos similares.
  4. Archivar y buscar contenido de audio por lotes.
  5. Enviar contenido hablado a RAG, bases de conocimiento o sistemas de búsqueda.

No resuelve directamente tareas de nivel superior como diarización de hablantes, resumen o segmentación por capítulos, pero puede servir como una capa de transcripción estable. Puedes añadir pyannote para diarización y un LLM para resumen y limpieza estructurada.

Sugerencias de despliegue

Para uso real, depura en este orden:

  1. Usa un clip de audio de 1 a 3 minutos para confirmar que el entorno corre correctamente.
  2. Prueba la precisión con muestras que coincidan con tu idioma y calidad de audio objetivo.
  3. Revisa el uso de memoria GPU antes de decidir si activar cuantización.
  4. Divide primero el audio largo, para que una tarea fallida no obligue a repetirlo todo.
  5. Guarda salidas TXT y SRT para facilitar la revisión posterior.

Para tareas del lado del servidor, carga el modelo durante el inicio del servicio en vez de recargarlo por cada solicitud. Cargar el modelo toma tiempo, y recargarlo con frecuencia también puede volver menos estable la gestión de memoria GPU.

Resumen

El valor de faster-whisper es que convierte Whisper en un componente de transcripción más adecuado para uso sostenido. No es un modelo distinto; es un backend de inferencia y una interfaz de ingeniería más eficientes.

Para flujos personales, puede convertir rápidamente videos, reuniones y audio de cursos en texto. Para tareas de servidor, puedes ajustar rendimiento con GPU, cuantización, batching y VAD. Siempre que el entorno de la máquina esté configurado correctamente, es más adecuado que la implementación original de Whisper para trabajos estables y por lotes de speech-to-text.

Proyecto: https://github.com/SYSTRAN/faster-whisper

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