Da a los modelos de lenguaje la capacidad de entender y responder con voz. Todo en local (whisper.cpp, llama.cpp, pipertts)

En esta entrada vamos a ver cómo dotar de la capacidad de entender la voz y responder con audio.

Para ello usaremos tres proyectos (realmente dos) con tres modelos diferentes:

  • Whisper.cpp, para convertir el audio en texto que pasaremos al modelo de lenguaje.
  • Llama.cpp, como motor del modelo de lenguaje.
  • Piper, para sintetizar audio a partir de la respuesta dada por el modelo de lenguaje.

Puedes ver la explicación y una demo de como funciona esto en el siguiente vídeo:

Haz click para ver el vídeo en Youtube

Instalar todo

1. Descargar Whisper.cpp

2. Construir Whisper.cpp

3. Descargar el modelo de audio a voz

Hay disponibles varios modelos:

ModeloLenguajeEspacio en discoMemoria RAM
tiny.enMultilenguaje75 MiB~273 MB
tiny.enInglés75 MiB~273 MB
baseMultilenguaje142 MiB~388 MB
base.enInglés142 MiB~388 MB
smallMultilenguaje466 MiB~852 MB
small.enInglés466 MiB~852 MB
mediumMultilenguaje1.5 GiB~2.1 GB
medium.enInglés1.5 GiB~2.1 GB
large-v1Multilenguaje2.9 GiB~3.9 GB
large-v2Multilenguaje2.9 GiB~3.9 GB
large-v3Multilenguaje2.9 GiB~3.9 GB
Modelos disponibles para Whisper.cpp

A más grande sea el modelo mejor resultado da, pero al mismo tiempo más potencia y memoria necesita para funcionar correctamente. Si no vas a hablar en inglés necesitas descargar un modelo multilenguaje.

4. Construir el programa talk-llama

Es necesario incluir la librería libsdl2-dev

En Windows puedes descargar el instalable de aqui

Construir:

5. Descargar el modelo de lenguaje

Whisper.cpp incluye su propia versión de llama.cpp por lo que no hace falta que instalemos y compilemos este proyecto. Si que es necesario que descarguemos cualquier modelo de lenguaje de los que soporta.

Yo he usado Llama-3B-Instruct cuantizado.

6. Instalar piper

Puede ser necesario instalar también aplay

7. Descargar una voz para piper

Puedes encontrar el listado de voces aqui.

Descarga el fichero del modelo de voz que desees y el fichero de configuración. ambos tiene que ir en el mismo directorio y tienen que tener el mismo nombre, solo que el fichero de configuración.

En mi caso:
es_ES-davefx-medium.onnx
es_ES-davefx-medium.onnx.json

8. Modificar el fichero speak

El fichero se encuentra en whisper.cpp/examples/talk-llama/speak

Busca las siguientes lineas:

if installed espeak; then
  espeak -v en-us+m$1 -s 225 -p 50 -a 200 -g 5 -k 5 -f $2

elif installed piper && installed aplay; then
  cat $2 | piper --model ~/en_US-lessac-medium.onnx --output-raw | aplay -q -r 22050 -f S16_LE -t raw -

Eliminas las dos primeras para evitar que use espeak (es un horror, tiene la calidad de audio una trituradora de metal).

Cambias la invocación a piper cambiando el elif por if y poniendo la ruta al modelo de piper que has descargado:

if installed piper && installed aplay; then
  cat $2 | piper --model ../es_ES-davefx-medium.onnx --output-raw | aplay -q -r 22050 -f S16_LE -t raw -

9 Ejecutarlo

Puedes ejecutar la aplicación talk-llama, los parámetros mínimos son:
-mw indica la ruta al modelo e whisper
-ml indica al ruta al modelo de lenguaje
-p indica el promtp inicial
-l el lenguaje, es buena idea indicarlo

Debo señalar que aunque «user» no es el prompt correcto para Llama 3, pero funciona correctamente.

El principal problema es que todo el sistema esta pensado para hablar en inglés. Así que hay que indicarle de alguna forma que hable en español, puedes decirselo al principio de la conversación o puedes forzarlo con:

El resultado

Esta conversación es en español. User: Hola, cmo ests?
LLaMA: Hola, estoy bien, gracias por preguntar.
Esta conversación es en español. User: Cul es la capital de Francia?
LLaMA: La capital de Francia es París.
Esta conversación es en español. User:

Se puede apreciar que faltan los «caracteres especiales del español» como tildes, ñ o símbolos de apertura y cierre de exclamación o interrogación.