[Lea el artículo] [Demostración] [Cara abrazada]
Moshi es un modelo básico de voz-texto y un marco de diálogo hablado full-duplex . Utiliza Mimi, un códec de audio neuronal en streaming de última generación. Mimi procesa audio de 24 kHz, hasta una representación de 12,5 Hz con un ancho de banda de 1,1 kbps, en forma de transmisión completa (latencia de 80 ms, el tamaño del cuadro), pero funciona mejor que los códecs existentes que no son de transmisión, como SpeechTokenizer (50 Hz). , 4 kbps) o SemantiCodec (50 Hz, 1,3 kbps).
Moshi modela dos flujos de audio : uno corresponde a Moshi y el otro al usuario. Por inferencia, la transmisión del usuario se toma de la entrada de audio y la de Moshi se toma de la salida del modelo. A lo largo de estos dos flujos de audio, Moshi predice tokens de texto correspondientes a su propio discurso, su monólogo interno , lo que mejora enormemente la calidad de su generación. Un transformador de profundidad pequeño modela las dependencias entre libros de códigos para un paso de tiempo determinado, mientras que un transformador temporal de parámetro 7B grande modela las dependencias temporales. Moshi logra una latencia teórica de 160 ms (80 ms para el tamaño de cuadro de Mimi + 80 ms de retardo acústico), con una latencia general práctica de tan solo 200 ms en una GPU L4.
Habla con Moshi ahora en nuestra demostración en vivo.
Mimi se basa en códecs de audio neuronales anteriores, como SoundStream y EnCodec, agregando un transformador tanto en el codificador como en el decodificador, y adaptando los avances para que coincidan con una velocidad de cuadros general de 12,5 Hz. Esto le permite a Mimi acercarse a la velocidad de fotogramas promedio de los tokens de texto (~3-4 Hz) y limitar la cantidad de pasos autorregresivos en Moshi. De manera similar a SpeechTokenizer, Mimi utiliza una pérdida de destilación para que los primeros tokens del libro de códigos coincidan con una representación autosupervisada de WavLM, lo que permite modelar información semántica y acústica con un solo modelo. Curiosamente, si bien Mimi es completamente causal y transmite, aprende a coincidir suficientemente bien con la representación no causal de WavLM, sin introducir ningún retraso. Finalmente, y de manera similar a EBEN, Mimi utiliza solo una pérdida de entrenamiento adversario , junto con la coincidencia de funciones, lo que muestra fuertes mejoras en términos de calidad subjetiva a pesar de su baja tasa de bits.
Hay tres versiones independientes de la pila de inferencia moshi en este repositorio.
La versión de Python que usa PyTorch se encuentra en el directorio moshi/
.
La versión de Python que usa MLX para Mac de la serie M se encuentra en el directorio moshi_mlx/
.
La versión de Rust utilizada en producción se encuentra en el directorio rust/
. Contiene en particular una implementación de Mimi en Rust, con enlaces de Python disponibles como rustymimi
.
Finalmente, el código para la demostración en vivo se proporciona en el directorio client/
.
Lanzamos tres modelos:
nuestro códec de voz Mimi,
Moshi afinó una voz sintética masculina (Moshiko),
Moshi afinó una voz sintética femenina (Moshika).
Dependiendo del backend, el formato de archivo y la cuantificación disponibles variarán. Aquí está la lista del repositorio de HuggingFace con cada modelo. Mimi está incluida en cada uno de ellos y siempre usa el mismo formato de punto de control.
Moshika para PyTorch (bf16): kyutai/moshika-pytorch-bf16.
Moshiko para PyTorch (bf16): kyutai/moshiko-pytorch-bf16.
Moshika para MLX (int4, int8, bf16): kyutai/moshika-mlx-q4, kyutai/moshika-mlx-q8, kyutai/moshika-mlx-bf16.
Moshiko para MLX (int4, int8, bf16): kyutai/moshiko-mlx-q4, kyutai/moshiko-mlx-q8, kyutai/moshiko-mlx-bf16.
Moshika para Rust/Candle (int8, bf16): kyutai/moshika-candle-q8, kyutai/moshika-mlx-bf16.
Moshiko para Rust/Candle (int8, bf16): kyutai/moshiko-candle-q8, kyutai/moshiko-mlx-bf16.
Todos los modelos se lanzan bajo la licencia CC-BY 4.0.
Necesitará al menos Python 3.10, aunque se recomienda 3.12. Para conocer requisitos específicos, consulte los directorios de backends individuales. Puede instalar los clientes PyTorch y MLX con lo siguiente:
pip install moshi # moshi PyTorch, de PyPIpip install moshi_mlx # moshi MLX, de PyPI, mejor con Python 3.12.# O las versiones de última generación para Moshi y Moshi-MLX.pip install -e "git+https://git@github .com/kyutai-labs/moshi.git#egg=moshi&subdirectory=moshi"pip install -e "git+https://[email protected]/kyutai-labs/moshi.git#egg=moshi_mlx&subdirectory=moshi_mlx"pip install Rustymimi # mimi, implementación de Rust con enlaces de Python desde PyPI
Si no está utilizando Python 3.12, es posible que obtenga un error al instalar moshi_mlx
o rustymimi
(del cual depende moshi_mlx
). Luego, deberá instalar la cadena de herramientas Rust o cambiar a Python 3.12.
Si bien esperamos que el código base actual funcione en Windows, no brindamos soporte oficial para ello. Hemos probado la versión MLX en un MacBook Pro M3. Por el momento, no admitimos la cuantización para la versión PyTorch, por lo que necesitarás una GPU con una cantidad significativa de memoria (24 GB).
Para utilizar el backend de Rust, necesitará una versión reciente de la cadena de herramientas de Rust. Para compilar la compatibilidad con GPU, también necesitará CUDA correctamente instalado para su GPU, en particular con nvcc
.
La API basada en PyTorch se puede encontrar en el directorio moshi
. Proporciona una versión en streaming del tokenizador de audio (mimi) y el modelo de lenguaje (moshi).
Para ejecutarlo en modo interactivo, debe iniciar un servidor que ejecutará el modelo; luego puede usar la interfaz de usuario web o un cliente de línea de comandos.
Inicie el servidor con:
python -m moshi.server [--gradio-tunnel] [--hf-repo kyutai/moshika-pytorch-bf16]
Y luego acceda a la interfaz de usuario web en localhost:8998. Si su GPU está en una máquina distante, esto no funcionará ya que los sitios web que usan http no pueden usar la API del worklet de audio. Hay dos formas de solucionar esto:
Reenvíe el puerto 8998 remoto a su host local usando el indicador ssh -L
. Luego se conecta a localhost:8998 como se mencionó anteriormente.
Utilice el argumento --gradio-tunnel
, esto configura un túnel con una URL accesible desde cualquier lugar. Tenga en cuenta que este túnel atraviesa EE. UU. y puede agregar una latencia significativa (hasta 500 ms desde Europa). Puede utilizar --gradio-tunnel-token
para establecer un token secreto fijo y reutilizar la misma dirección con el tiempo.
Puede usar --hf-repo
para seleccionar un modelo previamente entrenado diferente, configurando el repositorio de Hugging Face adecuado.
Acceder a un servidor que no es localhost a través de http puede causar problemas con el uso del micrófono en la interfaz de usuario web (en algunos navegadores esto solo está permitido usando https).
Un cliente local también está disponible, como
python -m moshi.client [--url URL_TO_GRADIO]
Sin embargo, tenga en cuenta que, a diferencia del navegador web, este cliente es básico: no realiza ninguna cancelación de eco ni intenta compensar un retraso creciente saltando fotogramas.
Para obtener más información, en particular sobre cómo utilizar la API directamente, consulte moshi/README.md.
Una vez que haya instalado moshi_mlx
, puede ejecutar
python -m moshi_mlx.local -q 4 # pesos cuantificados a 4 bitspython -m moshi_mlx.local -q 8 # pesos cuantificados a 8 bits# Y usando un modelo previamente entrenado diferente:python -m moshi_mlx.local -q 4 --hf- repositorio kyutai/moshika-mlx-q4 python -m moshi_mlx.local -q 8 --hf-repo kyutai/moshika-mlx-q8# tenga cuidado de hacer coincidir siempre el indicador `-q` y `--hf-repo`.
Esta interfaz de línea de comandos también es básica. No realiza ninguna cancelación de eco ni intenta compensar un retraso creciente saltando fotogramas.
Alternativamente, puede ejecutar python -m moshi_mlx.local_web
para usar la interfaz de usuario web, la conexión es a través de http y estará en localhost:8998.
Para ejecutar el servidor de inferencia de Rust, utilice el siguiente comando desde el directorio rust
:
ejecución de carga --features cuda --bin moshi-backend -r --config moshi-backend/config.json independiente
Cuando usa macOS, puede reemplazar --features cuda
con --features metal
.
Alternativamente, puede usar config-q8.json
en lugar de config.json
para usar el modelo q8 cuantificado. Puede seleccionar un modelo preentrenado diferente, por ejemplo, Moshika, cambiando la clave "hf_repo"
en cualquiera de los archivos.
Una vez que el servidor haya impreso "escucha de trabajador independiente", podrá utilizar la interfaz de usuario web. De forma predeterminada, el servidor Rust usa https, por lo que estará en localhost:8998.
Recibirá advertencias acerca de que el sitio no es seguro. Cuando utilice Chrome, puede omitirlos seleccionando "Detalles" o "Avanzado", luego "Visitar este sitio no seguro" o "Continuar con localhost (no seguro)".
Recomendamos utilizar la interfaz de usuario web, ya que proporciona cancelación de eco adicional que mejora la calidad general del modelo. Tenga en cuenta que la mayoría de los comandos mostrarán directamente esta interfaz de usuario en la URL proporcionada y, en general, no hay nada más que hacer.
Alternativamente, proporcionamos interfaces de línea de comandos para las versiones Rust y Python; el protocolo es el mismo que con la interfaz de usuario web, por lo que no hay nada que cambiar en el lado del servidor.
Como referencia, aquí está la lista de clientes de Moshi.
Desde dentro del directorio rust
, ejecute lo siguiente:
ejecución de carga --bin moshi-cli -r -- tui --host localhost
python -m moshi.cliente
ventana acoplable componer
Requiere el kit de herramientas de contenedor NVIDIA
La interfaz de usuario web se puede crear desde este repositorio mediante los siguientes pasos (estos requerirán la instalación de npm
).
cliente de CD instalación npm npm ejecutar compilación
La interfaz de usuario web se puede encontrar en el directorio client/dist
.
Si deseas instalar desde un clon de este repositorio, tal vez para desarrollar aún más Moshi, puedes hacer lo siguiente:
# Desde la raíz del clon de repopip install -e 'moshi[dev]'pip install -e 'moshi_mlx[dev]'pre-commit install
Si desea compilar rustymimi
localmente (suponiendo que tenga Rust instalado correctamente):
pip instalar maturin maturin dev -r -m óxido/mimi-pyo3/Cargo.toml
Consulte la sección de Preguntas frecuentes antes de abrir una edición.
El código actual se proporciona bajo la licencia MIT para las partes de Python y la licencia Apache para el backend de Rust. El código del cliente web se proporciona bajo la licencia MIT. Tenga en cuenta que partes de este código se basan en AudioCraft, publicado bajo la licencia MIT.
Los pesos de los modelos se publican bajo la licencia CC-BY 4.0.
Si utiliza Mimi o Moshi, cite el siguiente documento,
@techreport{kyutai2024moshi, title={Moshi: a speech-text foundation model for real-time dialogue}, author={Alexandre D'efossez and Laurent Mazar'e and Manu Orsini and Am'elie Royer and Patrick P'erez and Herv'e J'egou and Edouard Grave and Neil Zeghidour}, year={2024}, eprint={2410.00037}, archivePrefix={arXiv}, primaryClass={eess.AS}, url={https://arxiv.org/abs/2410.00037}, }