2 puntos por GN⁺ 2023-11-03 | 1 comentarios | Compartir por WhatsApp
  • Talk-Llama es un ejemplo de whisper.cpp donde, al hablar por micrófono en la terminal, Whisper convierte la voz en texto y LLaMA responde
  • Para capturar audio del micrófono se necesita SDL2, y al compilar hay que activar la opción de CMake WHISPER_SDL2=ON
  • Al ejecutarlo, se especifica el modelo Whisper con -mw; para conversaciones en tiempo real se recomiendan los modelos base o small
  • En -ml se especifica un modelo LLaMA compatible con ggml, y para preparar el modelo se deben seguir las instrucciones de llama.cpp
  • Usar --session FILE permite guardar y cargar el estado del modelo, lo que hace posible mantener el contexto en conversaciones largas o entre varias ejecuciones

Ejemplo de conversación por voz en la terminal

  • whisper.cpp/examples/talk-llama es un ejemplo para conversar por voz con una IA LLaMA desde la terminal
  • La demo de rendimiento al 2 de noviembre de 2023 se indica como ejecutada en una M2 Ultra con la combinación Whisper Medium + LLaMA v2 13B Q8_0
  • Una demo anterior se ofrece en un video separado como caso de ejecución en CPU

Flujo de compilación y ejecución

  • whisper-talk-llama depende de la biblioteca SDL2 para capturar audio del micrófono
  • Ejemplos de instalación de SDL2 por sistema operativo:
    • Linux basado en Debian: sudo apt-get install libsdl2-dev
    • Fedora Linux: sudo dnf install SDL2 SDL2-devel
    • Mac OS: brew install sdl2
  • En la compilación con CMake se activa la opción WHISPER_SDL2=ON
    • cmake -B build -S . -DWHISPER_SDL2=ON
    • cmake --build build --config Release
  • Un ejemplo de ejecución especifica en conjunto el modelo Whisper, el modelo LLaMA, el prompt y la cantidad de hilos
    • ./build/bin/whisper-talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

Opciones para especificar modelos

  • El argumento -mw especifica el modelo Whisper que se usará
    • Para una experiencia en tiempo real se recomiendan los modelos base o small
  • El argumento -ml especifica el modelo LLaMA que se usará
    • Para obtener un modelo LLaMA compatible con ggml, se indica consultar las instrucciones de llama.cpp

Continuar el contexto con un archivo de sesión

  • whisper-talk-llama admite gestión de sesiones para conversaciones más coherentes y continuas
  • Puede mantener el contexto de interacciones anteriores para entender y responder de forma más natural a las solicitudes del usuario
  • El soporte de sesiones se activa al ejecutar con la opción de línea de comandos --session FILE
    • Después de cada interacción, el estado del modelo de whisper-talk-llama se guarda en el archivo especificado
    • Si el archivo no existe, se crea uno nuevo
    • Si el archivo existe, se carga el estado del modelo desde ese archivo y se reanuda la sesión anterior
  • Es útil al interactuar con el AI assistant durante conversaciones largas o a lo largo de varias sesiones, ya que recuerda interacciones previas y ofrece respuestas contextuales más relevantes
  • Ejemplo de ejecución:
    • ./build/bin/whisper-talk-llama --session ./my-session-file -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

Salida de voz y feedback

  • Para escuchar en voz las respuestas de texto generadas, se necesita una herramienta TTS
  • Se puede usar el motor TTS que se prefiera y modificar el script speak según las necesidades
  • La configuración predeterminada usa say de MacOS o SpeechSynthesizer de Windows
  • Se indica que el feedback puede darse en GitHub Discussion #672

1 comentarios

 
GN⁺ 2023-11-03
Opiniones de Hacker News
  • Qué divertido verlo aquí :)
    El rendimiento de Apple Silicon probablemente haya mejorado mucho desde lo que se ve en el video. whisper.cpp ahora corre completamente en la GPU, y en los últimos meses la velocidad de generación de llama.cpp también mejoró bastante.

    • Solo pasaron 13 minutos hasta el commit del nuevo video demo, nada mal :D
      De hecho, el rendimiento también es impresionante.
    • Parece que ya te estás volviendo bastante conocido. Es muy probable que haya mucha gente siguiendo de cerca GitHub.
    • Envié un PR para subir la nueva demo al principio. Creo que la nueva demo es mucho mejor.
    • ¿Apple Silicon es lo más rentable para correr esto, o se podría hacer más barato en un servidor Linux de homelab con buen rendimiento?
    • ¿Funcionará también con el distilled Llama más reciente?
  • Está genial. En un proyecto reciente conecté Llama con un modelo de síntesis de voz open source, y había muchos elementos de ingeniería interesantes.
    Personalmente, las herramientas de asistencia de código que me resultan más útiles son las que reducen la carga de trabajo manual, como generar argumentos y tipos a partir de docstrings, o al revés, más que intentar reemplazar el pensamiento difícil o la resolución de problemas. Para tareas más complejas, hay que darle a la herramienta de asistencia un punto de partida bastante bueno.
    Suelo hablar solo mientras programo, y si una herramienta así pudiera embeber lo que digo como vectores de contexto para usarlo como entrada adicional y darle al modelo un mejor punto de partida, sería realmente futurista y útil. Adopté Copilot tarde y no lo uso siempre, pero si alguien conoce algo parecido, me interesa.

  • Si la propuesta de pesos abiertos se vuelve realidad en 270 días, en unos meses podría quedar prácticamente prohibida.

    • Esa afirmación no está respaldada por el texto de la orden ejecutiva de Biden. Solo exige a varias agencias gubernamentales que creen marcos de evaluación de seguridad, realicen una evaluación inicial de los modelos de pesos abiertos y presenten recomendaciones al presidente en un plazo de 270 días.
      Hasta donde encontré, no hay nada sobre prohibir modelos de pesos abiertos. Tampoco parece haber muchas razones para que las recomendaciones finales incluyan “prohíbanlos”.
      Por ejemplo, puedo imaginar recomendaciones favorables a los actores establecidos, como hacer que la carga de adoptar modelos de pesos abiertos por parte del gobierno sea tan alta que comprar OpenAI parezca mucho más atractivo. Pero eso es distinto a lo que se dijo originalmente.
      La orden ejecutiva parece bastante fácil de leer; ¿hay algo en el texto que se me haya pasado?
      https://www.whitehouse.gov/briefing-room/presidential-action...
    • No veo nada que diga que se prohibirán los pesos. La parte que vi se parece más a pedir un informe sobre los riesgos y beneficios de los pesos abiertos.
      Coincido en que la forma en que el alcance queda abierto es preocupante, pero ¿dónde está la prohibición real?
    • ¿Qué tan grave es esta amenaza? ¿Cómo podrían hacer cumplir algo tan tonto sin siquiera consultar con los líderes de la industria?
  • Al ejecutar ./talk-llama en Arch y Debian aparece una floating point exception. Ya revisé sdl2lib y ffmpeg, y también vi el issue relacionado (https://github.com/ggerganov/whisper.cpp/issues/1325), pero no se soluciona. ¿A alguien más le pasa?

    • Tuve el mismo error en PopOS 22.04, y esto me ayudó:
      https://github.com/ggerganov/whisper.cpp/issues/352#issuecom...
      No tengo claro qué fue lo que cambió, pero básicamente eliminé ffmpeg y libsdl2-dev y ejecuté make desde la raíz del repositorio. Después instalé libsdl2 y ffmpeg, e hice make talk-llama.
      En un i7-8550U de 4 núcleos y 16 GB de RAM es bastante lento.
      Desde la raíz del repositorio hice más o menos esto:
      $ sudo apt purge ffmpeg
      $ make clean
      $ git pull
      $ make
      $ sudo apt install libsdl2-dev
      $ make talk-llama
      $ ./talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-2-13b.Q4_0.gguf -p "t0mk" -t 8\n\n
  • ¿No hay alguna solución de conversión de texto a voz que reciba el stream de texto y lo diga de inmediato, sin esperar a que Llama termine de generar?
    Supongo que solo sería posible si el modelo llena el búfer lo suficientemente rápido como para que el motor de síntesis de voz no se detenga.

    • Si al búfer le queda una sola palabra, podrían hacer que llama.cpp emita cosas como “um”, “uhh” :D
    • Para que el timing y el énfasis queden mejor, hay que saber hacia dónde va la oración. Si no, puede sonar como un intérprete de la ONU, con las palabras saliendo de forma plana una tras otra.
    • ElevenLabs y Gemelo.AI son servicios que soportan streaming de entrada de texto justamente para este uso. No conozco modelos open source de síntesis de voz incremental (Incremental TTS), pero se puede implementar algo parecido almacenando tokens en un búfer y enviándolos al modelo de síntesis de voz cuando aparece puntuación.
  • En vez de esperar a que termine toda la respuesta del LLM, ¿se podría reducir la latencia transmitiendo a la síntesis de voz, a medida que se genera, en bloques de unos 6 tokens?

    • Sí, en ese momento pensaba hacerlo así, pero surgieron otras cosas. Este ejemplo simple se puede mejorar de varias maneras
      Actualmente solo usa un umbral adaptativo básico para la detección de fin de enunciado, pero eso se puede mejorar; también se podría hacer que un LLM pequeño genere respuestas rápidas generales mientras el LLM grande calcula. La síntesis de voz también se puede transmitir por chunks o por oraciones
      Creo que una de las mejores versiones open source de este tipo de chatbot es https://github.com/yacineMTB/talk. Es muy probable que ahora haya más proyectos similares
  • ¿Cuál es la mejor interfaz de chat para Llama? Tengo una 3090 y quiero probar correr un modelo para tareas rápidas de programación desde la terminal

    • ollama es realmente fácil de usar. Es un binario único que descarga modelos cuando los necesitas, parecido a cómo Docker descarga imágenes
      pacman -S ollama
      ollama serve
      ollama run llama2:13b 'insert prompt'
      https://ollama.ai/
    • Hay un proyecto open source que también soporta voz:
      https://github.com/cogentapps/chat-with-gpt
      Parece estar hecho para usar ElevenLabs y la API de OpenAI, pero quizá sea fácil configurarlo para Whisper.cpp y Llama locales
    • No es open source, pero por ahora sigue siendo gratis: lmstudio.ai. Tiene historial de chats, una UI de configuración decente, gestión sencilla de prompts, administración y exploración de modelos, configuración simple, es multiplataforma e incluso incluye un servidor API para conectarlo con otras herramientas
      Están contratando y no tienen una estrategia de monetización pública, así que supongo que pronto habrá cambios, como cobrar por algunas funciones que hoy son gratis o limitarlas a propósito. Aun así, para las LLM gratuitas, a las apps ligeras que dependen totalmente de llama.cpp les cuesta generar dependencia del proveedor. Si priorizas que sea open source por encima de las funciones, yo también recomendaría ollama
    • Lo más fácil de configurar es esto: https://faraday.dev/
      Para preguntas técnicas, creo que ahora Wizard es lo que está de moda
    • Depende de qué entiendas por “mejor”. Si buscas la inferencia de vanguardia más rápida posible, en una 4090 sería ExLlama o ExLlamaV2
  • ollama me tiene muy satisfecho para ejecutar LLM locales open source, pero ¿cuál sería el equivalente para Whisper o para modelos open source modernos de síntesis de voz? No conozco bien proyectos que hagan que configurar Whisper localmente sea así de simple

  • ¿Alguien puede explicar de forma simple qué puede hacer esto? ¿Puede ir creando algo como una memoria a largo plazo, aprendiendo y manteniendo el contexto del chat?

    • No soy experto en LLM, pero según entiendo es una arquitectura que ejecuta reconocimiento de voz → Llama → síntesis de voz en tu propia PC, no en servidores de terceros
      El límite de contexto del LLM depende del modelo y la configuración que elija el usuario. Por ejemplo, depende de si usas Llama 2, Wizard Vicuna u otro modelo, y de cómo hayas configurado la ventana de contexto. Puede resultar confuso porque el LLM no tanto “responde” al usuario, sino que predice la continuación más probable dentro de un historial de conversación entre el usuario y un assistant útil; como resultado logra fingir ser un assistant útil y termina siendo, de hecho, un assistant útil
      Si se cambia el pipeline, creo que ese comportamiento sería posible. La estructura pasaría a ser reconocimiento de voz → Wrapper[Llama] → síntesis de voz, y se vuelve interesante si el Wrapper puede aplicar procesamiento adicional al texto de entrada mientras deja que Llama haga lo suyo
      El Wrapper podría analizar la conversación y extraer elementos clave como “esta persona se llama Bob, es hombre, tiene 35 años, le gustan los perros y prefiere las cosas ordenadas; quiere un recordatorio para llamar a su hija a las 5 p. m.; es un agente encubierto de la mafia antártica; y prefiere que le hablen con un fuerte acento polaco”, y actuar en consecuencia
      Por ejemplo, podría crear un recordatorio para las 5 p. m. mediante HomeAssistant, configurar el motor de síntesis de voz con acento polaco y modificar el historial de conversación inicial de ejecuciones posteriores. Sería algo como poner el nombre de la persona dentro de la conversación interna del chat y, en la presentación previa de la siguiente conversación, ofrecer una versión comprimida de sus intereses y personalidad
      Así se obtiene interactividad mediante acciones realizadas por otras herramientas, y también continuidad modificando el historial de la siguiente conversación
  • Esto realmente tiene una vibra muy fuerte a ELIZA