whisper.cpp es una implementación en C/C++ del modelo Whisper de OpenAI, diseñada para ejecutar transcripción de audio a texto de forma local, sin depender de servicios externos ni conexión a Internet. Su principal ventaja es que permite aprovechar la potencia del modelo Whisper en entornos autoalojados, con un consumo de recursos contenido y soporte para múltiples arquitecturas, incluyendo CPU sin GPU y dispositivos modestos.
Esta herramienta es especialmente útil en escenarios donde la privacidad, el control de los datos y la independencia de servicios cloud son prioritarios. Gracias a su enfoque local, el audio nunca sale del sistema, lo que la convierte en una opción ideal para proyectos de self-hosting, automatización y domótica.
En el contexto de Home Assistant, whisper.cpp se utiliza como motor de transcripción interno dentro de su sistema de Voice Assistant, permitiendo convertir audio capturado desde micrófonos o dispositivos compatibles en texto de forma completamente local. Este texto es el que posteriormente se procesa para interpretar comandos, ejecutar automatizaciones o interactuar con el asistente de voz, todo ello sin enviar el audio a servicios externos. Gracias a whisper.cpp, Home Assistant puede ofrecer reconocimiento de voz autoalojado, preservando la privacidad y manteniendo el control total sobre la infraestructura.
Instalación de Whisper
Tendremos que descargarnos el repositorio para compilarlo posteriormente:
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cppDentro del directorio, ejecutamos el comando para compilar:
makeTardará un rato en compilar todo, cuando acabe, ya podremos usar whisper.
Descargar el modelo
Para que funcione correctamente whisper, es recomendable descargar un modelo de lenguaje, puede ser tiny, base, small, medium o large.
bash models/download-ggml-model.sh smallTranscribir tu audio
Ahora para transformar tu audio en texto, podemos utilizar este comando:
./build/bin/whisper-cli -m models/ggml-small.bin -l es -f audio.mp3Ejemplo de transcripción
Para hacer este tutorial, he grabado un trozo de texto que he leído de la Wikipedia que habla sobre las naranjas. De esta manera podemos mirar como es el proceso completo:
Ejecutamos el comando:
./build/bin/whisper-cli -m models/ggml-medium.bin -l es -f naranjas.mp3Y este es el resultado completo del comando:
whisper_init_from_file_with_params_no_state: loading model from 'models/ggml-medium.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
whisper_init_with_params_no_state: devices = 1
whisper_init_with_params_no_state: backends = 1
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 768
whisper_model_load: n_audio_head = 12
whisper_model_load: n_audio_layer = 12
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 768
whisper_model_load: n_text_head = 12
whisper_model_load: n_text_layer = 12
whisper_model_load: n_mels = 80
whisper_model_load: ftype = 1
whisper_model_load: qntvr = 0
whisper_model_load: type = 3 (medium)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs = 99
whisper_model_load: CPU total size = 487.01 MB
whisper_model_load: model size = 487.01 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size = 18.87 MB
whisper_init_state: kv cross size = 56.62 MB
whisper_init_state: kv pad size = 4.72 MB
whisper_init_state: compute buffer (conv) = 22.42 MB
whisper_init_state: compute buffer (encode) = 33.85 MB
whisper_init_state: compute buffer (cross) = 6.20 MB
whisper_init_state: compute buffer (decode) = 97.28 MB
system_info: n_threads = 4 / 16 | WHISPER : COREML = 0 | OPENVINO = 0 | CPU : SSE3 = 1 | SSSE3 = 1 | AVX = 1 | AVX2 = 1 | F16C = 1 | FMA = 1 | BMI2 = 1 | OPENMP = 1 | REPACK = 1 |
main: processing 'naranjas.mp3' (775314 samples, 48.5 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = es, task = transcribe, timestamps = 1 ...
[00:00:00.000 --> 00:00:08.040] La naranja es una fruta cítica obtenida del naranjo dulce, del naranjo amargo y de los
[00:00:08.040 --> 00:00:14.880] naranjos de otras variedades o híbitidos, de origen asiático. Se cultiva como un antiguo
[00:00:14.880 --> 00:00:23.520] árbol ornamental y para obtener fragancias de sus frutos. Es más pequeña y dulce que
[00:00:23.520 --> 00:00:31.000] el pomelo o la toronja y más grande, aunque menos perfumada que la mandarina. Existen numerosas
[00:00:31.000 --> 00:00:36.720] variedades de naranja, siendo la mayoría híbitos productos a partir de especies citrus máxima.
[00:00:36.720 --> 00:00:43.440] Las naranjas dulces crecen en la variedad de tamaños diferentes y formas que varían
[00:00:43.440 --> 00:00:46.000] desde esféricas hasta oblongas.
whisper_print_timings: load time = 920.92 ms
whisper_print_timings: fallbacks = 0 p / 0 h
whisper_print_timings: mel time = 44.37 ms
whisper_print_timings: sample time = 278.39 ms / 871 runs ( 0.32 ms per run)
whisper_print_timings: encode time = 11516.07 ms / 2 runs ( 5758.04 ms per run)
whisper_print_timings: decode time = 17.46 ms / 1 runs ( 17.46 ms per run)
whisper_print_timings: batchd time = 6033.75 ms / 863 runs ( 6.99 ms per run)
whisper_print_timings: prompt time = 432.19 ms / 89 runs ( 4.86 ms per run)
whisper_print_timings: total time = 19416.10 msY como podemos observar en toda la salida, aquí tenemos la transcripción del audio:
[00:00:00.000 --> 00:00:08.040] La naranja es una fruta cítica obtenida del naranjo dulce, del naranjo amargo y de los
[00:00:08.040 --> 00:00:14.880] naranjos de otras variedades o híbitidos, de origen asiático. Se cultiva como un antiguo
[00:00:14.880 --> 00:00:23.520] árbol ornamental y para obtener fragancias de sus frutos. Es más pequeña y dulce que
[00:00:23.520 --> 00:00:31.000] el pomelo o la toronja y más grande, aunque menos perfumada que la mandarina. Existen numerosas
[00:00:31.000 --> 00:00:36.720] variedades de naranja, siendo la mayoría híbitos productos a partir de especies citrus máxima.
[00:00:36.720 --> 00:00:43.440] Las naranjas dulces crecen en la variedad de tamaños diferentes y formas que varían
[00:00:43.440 --> 00:00:46.000] desde esféricas hasta oblongas.¿Ni tan mal, verdad?
Conclusión
En este tutorial hemos visto cómo utilizar whisper.cpp para transcribir un archivo de audio a texto de forma local, rápida y sin depender de servicios externos. A lo largo del proceso hemos comprobado que se trata de una herramienta potente, flexible y sorprendentemente eficiente, incluso en sistemas sin aceleración por GPU.
Más allá de la simple transcripción, whisper.cpp abre la puerta a múltiples usos avanzados: automatizaciones, asistentes de voz personalizados, indexación de audios o integración con plataformas como Home Assistant. Todo ello con una premisa clara: los datos se quedan en casa.
Si buscas una solución fiable para convertir voz en texto dentro de tu propia infraestructura, whisper.cpp es una opción sólida, madura y alineada con la filosofía del software libre y el self-hosting. A partir de aquí, el siguiente paso natural es integrarlo en tus flujos habituales y sacarle partido en escenarios reales.
Más sobre ./voidNull
- 📖 Aprende todos sobre los comandos de GNU/Linux en nuestro Diccionario "De la A a la Z: Los comandos de GNU/Linux"
- 💪 ¡Forma parte de la Comunidad de ./voidNull!
- 🤖 Disfruta de todos nuestros Cursos sobre Ansible, Proxmox, Home Assistant entre otros.
- 📩 Mantente actualizado con lo último en GNU/Linux y Software Libre. Recibe nuestra Newsletter mensual.
Comentarios