[Lire l'article] [Démo] [Hugging Face]
Moshi est un modèle de base parole-texte et un cadre de dialogue parlé en duplex intégral . Il utilise Mimi, un codec audio neuronal de diffusion en continu de pointe. Mimi traite l'audio de 24 kHz, jusqu'à une représentation de 12,5 Hz avec une bande passante de 1,1 kbps, de manière entièrement en streaming (latence de 80 ms, la taille de l'image), mais fonctionne mieux que les codecs existants, sans streaming, comme SpeechTokenizer (50 Hz , 4 kbps) ou SemantiCodec (50 Hz, 1,3 kbps).
Moshi modélise deux flux audio : l'un correspond à Moshi, et l'autre à l'utilisateur. Lors de l'inférence, le flux de l'utilisateur est extrait de l'entrée audio et celui de Moshi est échantillonné à partir de la sortie du modèle. Le long de ces deux flux audio, Moshi prédit des jetons de texte correspondant à son propre discours, son monologue intérieur , ce qui améliore grandement la qualité de sa génération. Un petit transformateur de profondeur modélise les dépendances entre livres de codes pour un pas de temps donné, tandis qu'un grand transformateur temporel à paramètre 7B modélise les dépendances temporelles. Moshi atteint une latence théorique de 160 ms (80 ms pour la taille d'image de Mimi + 80 ms de retard acoustique), avec une latence globale pratique aussi faible que 200 ms sur un GPU L4.
Parlez à Moshi maintenant sur notre démo en direct.
Mimi s'appuie sur les codecs audio neuronaux précédents tels que SoundStream et EnCodec, en ajoutant un transformateur à la fois dans l'encodeur et le décodeur, et en adaptant les foulées pour correspondre à une fréquence d'images globale de 12,5 Hz. Cela permet à Mimi de se rapprocher de la fréquence d'images moyenne des jetons de texte (~ 3-4 Hz) et de limiter le nombre d'étapes autorégressives dans Moshi. À l'instar de SpeechTokenizer, Mimi utilise une perte de distillation afin que les premiers jetons du livre de codes correspondent à une représentation auto-supervisée de WavLM, ce qui permet de modéliser des informations sémantiques et acoustiques avec un seul modèle. Fait intéressant, bien que Mimi soit entièrement causal et continu, il apprend à correspondre suffisamment bien à la représentation non causale de WavLM, sans introduire de retard. Enfin, et à l'instar d'EBEN, Mimi utilise uniquement une perte d'entraînement contradictoire , ainsi qu'une correspondance de fonctionnalités, montrant de fortes améliorations en termes de qualité subjective malgré son faible débit.
Il existe trois versions distinctes de la pile d'inférence moshi dans ce dépôt.
La version Python utilisant PyTorch se trouve dans le répertoire moshi/
.
La version Python utilisant MLX pour les Mac de la série M se trouve dans le répertoire moshi_mlx/
.
La version Rust utilisée en production se trouve dans le répertoire rust/
. Celui-ci contient notamment une implémentation Mimi dans Rust, avec des liaisons Python disponibles sous rustymimi
.
Enfin, le code de la démo live est fourni dans le répertoire client/
.
Nous publions trois modèles :
notre codec vocal Mimi,
Moshi peaufiné sur une voix synthétique masculine (Moshiko),
Moshi peaufiné sur une voix synthétique féminine (Moshika).
En fonction du backend, le format de fichier et la quantification disponibles varient. Voici la liste des repo HuggingFace avec chaque modèle. Mimi est intégré à chacun d'entre eux et utilise toujours le même format de point de contrôle.
Moshika pour PyTorch (bf16) : kyutai/moshika-pytorch-bf16.
Moshiko pour PyTorch (bf16) : kyutai/moshiko-pytorch-bf16.
Moshika pour MLX (int4, int8, bf16) : kyutai/moshika-mlx-q4, kyutai/moshika-mlx-q8, kyutai/moshika-mlx-bf16.
Moshiko pour MLX (int4, int8, bf16) : kyutai/moshiko-mlx-q4, kyutai/moshiko-mlx-q8, kyutai/moshiko-mlx-bf16.
Moshika pour Rust/Candle (int8, bf16) : kyutai/moshika-candle-q8, kyutai/moshika-mlx-bf16.
Moshiko pour Rust/Candle (int8, bf16) : kyutai/moshiko-candle-q8, kyutai/moshiko-mlx-bf16.
Tous les modèles sont publiés sous la licence CC-BY 4.0.
Vous aurez besoin d'au moins Python 3.10, la version 3.12 étant recommandée. Pour des exigences spécifiques, veuillez consulter les répertoires backend individuels. Vous pouvez installer les clients PyTorch et MLX avec les éléments suivants :
pip install moshi # moshi PyTorch, depuis PyPIpip install moshi_mlx # moshi MLX, depuis PyPI, mieux avec Python 3.12.# Ou les versions de pointe pour Moshi et 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, implémentation de rust avec les liaisons Python de PyPI
Si vous n'utilisez pas Python 3.12, vous pourriez obtenir une erreur lors de l'installation moshi_mlx
ou rustymimi
(dont dépend moshi_mlx
). Ensuite, vous devrez installer la chaîne d'outils Rust ou passer à Python 3.12.
Même si nous espérons que la base de code actuelle fonctionnera sous Windows, nous n'en fournissons pas de support officiel. Nous avons testé la version MLX sur un MacBook Pro M3. Pour le moment, nous ne prenons pas en charge la quantification pour la version PyTorch, vous aurez donc besoin d'un GPU avec une quantité de mémoire importante (24 Go).
Pour utiliser le backend Rust, vous aurez besoin d'une version récente de la chaîne d'outils Rust. Pour compiler le support GPU, vous aurez également besoin du CUDA correctement installé pour votre GPU, notamment avec nvcc
.
L'API basée sur PyTorch se trouve dans le répertoire moshi
. Il fournit une version streaming du tokenizer audio (mimi) et du modèle de langage (moshi).
Pour exécuter en mode interactif, vous devez démarrer un serveur qui exécutera le modèle, vous pouvez ensuite utiliser soit l'interface utilisateur Web, soit un client de ligne de commande.
Démarrez le serveur avec :
python -m moshi.server [--gradio-tunnel] [--hf-repo kyutai/moshika-pytorch-bf16]
Ensuite, accédez à l'interface utilisateur Web sur localhost:8998. Si votre GPU se trouve sur une machine distante, cela ne fonctionnera pas car les sites Web utilisant http ne sont pas autorisés à utiliser l'API du worklet audio. Il existe deux façons de contourner ce problème :
Transférez le port 8998 distant vers votre hôte local à l'aide de l'indicateur ssh -L
. Se connecte ensuite à localhost:8998 comme mentionné précédemment.
Utilisez l'argument --gradio-tunnel
, cela configure un tunnel avec une URL accessible de n'importe où. Gardez à l’esprit que ce tunnel passe par les États-Unis et peut ajouter une latence importante (jusqu’à 500 ms depuis l’Europe). Vous pouvez utiliser --gradio-tunnel-token
pour définir un jeton secret fixe et réutiliser la même adresse au fil du temps.
Vous pouvez utiliser --hf-repo
pour sélectionner un autre modèle pré-entraîné, en définissant le référentiel Hugging Face approprié.
L'accès à un serveur qui n'est pas localhost via http peut entraîner des problèmes d'utilisation du microphone dans l'interface utilisateur Web (dans certains navigateurs, cela n'est autorisé qu'en utilisant https).
Un client local est également disponible, comme
python -m moshi.client [--url URL_TO_GRADIO]
Notez cependant que, contrairement au navigateur Web, ce client est simple : il n'effectue aucune annulation d'écho, et ne tente pas non plus de compenser un décalage croissant en sautant des images.
Pour plus d'informations, en particulier sur la façon d'utiliser directement l'API, veuillez consulter moshi/README.md.
Une fois que vous avez installé moshi_mlx
, vous pouvez exécuter
python -m moshi_mlx.local -q 4 # poids quantifiés à 4 bitspython -m moshi_mlx.local -q 8 # poids quantifiés à 8 bits# Et en utilisant un modèle pré-entraîné différent :python -m moshi_mlx.local -q 4 --hf- dépôt kyutai/moshika-mlx-q4 python -m moshi_mlx.local -q 8 --hf-repo kyutai/moshika-mlx-q8# veillez à toujours faire correspondre les indicateurs `-q` et `--hf-repo`.
Cette interface de ligne de commande est également simple. Il n'effectue aucune annulation d'écho et n'essaie pas non plus de compenser un décalage croissant en sautant des images.
Vous pouvez également exécuter python -m moshi_mlx.local_web
pour utiliser l'interface utilisateur Web, la connexion se fait via http et se fera sur localhost:8998.
Pour exécuter le serveur d'inférence Rust, utilisez la commande suivante depuis le répertoire rust
:
cargo run --features cuda --bin moshi-backend -r -- --config moshi-backend/config.json autonome
Lorsque vous utilisez macOS, vous pouvez remplacer --features cuda
par --features metal
.
Vous pouvez également utiliser config-q8.json
plutôt que config.json
pour utiliser le modèle q8 quantifié. Vous pouvez sélectionner un autre modèle pré-entraîné, par exemple Moshika, en modifiant la clé "hf_repo"
dans l'un ou l'autre fichier.
Une fois que le serveur a imprimé « écoute de travailleur autonome », vous pouvez utiliser l'interface utilisateur Web. Par défaut, le serveur Rust utilise https, il sera donc localhost : 8998.
Vous recevrez des avertissements indiquant que le site est dangereux. Lorsque vous utilisez Chrome, vous pouvez les contourner en sélectionnant « Détails » ou « Avancé », puis « Visiter ce site dangereux » ou « Passer à localhost (dangereux) ».
Nous vous recommandons d'utiliser l'interface utilisateur Web, car elle offre une annulation d'écho supplémentaire qui améliore la qualité globale du modèle. Notez que la plupart des commandes serviront directement cette interface utilisateur dans l'URL fournie, et qu'il n'y a en général plus rien à faire.
Alternativement, nous fournissons des interfaces de ligne de commande pour les versions Rust et Python, le protocole est le même qu'avec l'interface Web donc il n'y a rien à changer côté serveur.
Pour référence, voici la liste des clients de Moshi.
Depuis le répertoire rust
, exécutez ce qui suit :
cargo run --bin moshi-cli -r -- tui --host localhost
python -m moshi.client
Docker compose
Nécessite le kit d'outils de conteneur NVIDIA
L'interface utilisateur Web peut être créée à partir de ce référentiel via les étapes suivantes (celles-ci nécessiteront l'installation npm
).
client cd installation npm npm exécuter la construction
L'interface utilisateur Web se trouve alors dans le répertoire client/dist
.
Si vous souhaitez installer à partir d'un clone de ce référentiel, peut-être pour développer davantage Moshi, vous pouvez procéder comme suit :
# Depuis la racine du clone du repopip install -e 'moshi[dev]'pip install -e 'moshi_mlx[dev]'pre-commit install
Si vous souhaitez construire localement rustymimi
(en supposant que Rust soit correctement installé) :
pip installer maturin maturin dev -r -m rust/mimi-pyo3/Cargo.toml
Consultez la section Foire aux questions avant d'ouvrir un problème.
Le présent code est fourni sous licence MIT pour les parties Python et sous licence Apache pour le backend Rust. Le code du client Web est fourni sous licence MIT. Notez que certaines parties de ce code sont basées sur AudioCraft, publié sous licence MIT.
Les poids des modèles sont publiés sous la licence CC-BY 4.0.
Si vous utilisez Mimi ou Moshi, veuillez citer l'article suivant,
@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}, }