[Die Zeitung lesen] [Demo] [Gesicht umarmen]
Moshi ist ein Sprachtext-Grundlagenmodell und ein Vollduplex- Framework für gesprochene Dialoge. Es verwendet Mimi, einen hochmodernen Streaming-Neuronal-Audio-Codec. Mimi verarbeitet 24-kHz-Audio bis hin zu einer 12,5-Hz-Darstellung mit einer Bandbreite von 1,1 kbit/s im vollständigen Streaming-Verfahren (Latenz von 80 ms, der Bildgröße) und bietet dennoch eine bessere Leistung als bestehende, nicht streamende Codecs wie SpeechTokenizer (50 Hz). , 4 kbps) oder SemantiCodec (50 Hz, 1,3 kbps).
Moshi modelliert zwei Audioströme : einer entspricht Moshi und der andere dem Benutzer. Bei der Inferenz wird der Stream des Benutzers vom Audioeingang übernommen und der Stream für Moshi wird vom Ausgang des Modells abgetastet. Entlang dieser beiden Audioströme sagt Moshi Text-Token voraus, die seiner eigenen Sprache, seinem inneren Monolog , entsprechen, was die Qualität seiner Generierung erheblich verbessert. Ein kleiner Tiefentransformator modelliert Abhängigkeiten zwischen Codebüchern für einen bestimmten Zeitschritt, während ein großer Temporaltransformator mit 7B Parametern die zeitlichen Abhängigkeiten modelliert. Moshi erreicht eine theoretische Latenz von 160 ms (80 ms für die Framegröße von Mimi + 80 ms akustische Verzögerung), wobei die praktische Gesamtlatenz auf einer L4-GPU nur 200 ms beträgt.
Sprechen Sie jetzt mit Moshi in unserer Live-Demo.
Mimi baut auf früheren neuronalen Audio-Codecs wie SoundStream und EnCodec auf, fügt sowohl im Encoder als auch im Decoder einen Transformer hinzu und passt die Schritte an eine Gesamtbildrate von 12,5 Hz an. Dadurch kann Mimi näher an die durchschnittliche Bildrate von Text-Tokens (~3–4 Hz) herankommen und die Anzahl der autoregressiven Schritte in Moshi begrenzen. Ähnlich wie SpeechTokenizer verwendet Mimi einen Destillationsverlust, sodass die ersten Codebuch-Token mit einer selbstüberwachten Darstellung von WavLM übereinstimmen, was die Modellierung semantischer und akustischer Informationen mit einem einzigen Modell ermöglicht. Interessanterweise lernt Mimi, obwohl es vollständig kausal und streamend ist, ausreichend gut mit der nicht-kausalen Darstellung von WavLM übereinzustimmen, ohne dass es zu Verzögerungen kommt. Schließlich nutzt Mimi, ähnlich wie EBEN, neben dem Feature-Matching nur einen kontradiktorischen Trainingsverlust , was trotz der niedrigen Bitrate starke Verbesserungen in Bezug auf die subjektive Qualität zeigt.
In diesem Repo gibt es drei separate Versionen des Moshi-Inferenzstapels.
Die Python-Version, die PyTorch verwendet, befindet sich im Verzeichnis moshi/
.
Die Python-Version, die MLX für Macs der M-Serie verwendet, befindet sich im Verzeichnis moshi_mlx/
.
Die in der Produktion verwendete Rust-Version befindet sich im Verzeichnis rust/
. Dies beinhaltet insbesondere eine Mimi-Implementierung in Rust, wobei Python-Bindungen als rustymimi
verfügbar sind.
Abschließend wird der Code für die Live-Demo im Verzeichnis client/
bereitgestellt.
Wir veröffentlichen drei Modelle:
unser Sprachcodec Mimi,
Moshi hat eine männliche synthetische Stimme (Moshiko) verfeinert.
Moshi hat eine weibliche synthetische Stimme (Moshika) verfeinert.
Je nach Backend variieren das Dateiformat und die verfügbare Quantisierung. Hier ist die Liste des HuggingFace-Repos für jedes Modell. Mimi ist in jedem dieser Pakete enthalten und verwendet immer das gleiche Prüfpunktformat.
Moshika für PyTorch (bf16): kyutai/moshika-pytorch-bf16.
Moshiko für PyTorch (bf16): kyutai/moshiko-pytorch-bf16.
Moshika für MLX (int4, int8, bf16): kyutai/moshika-mlx-q4, kyutai/moshika-mlx-q8, kyutai/moshika-mlx-bf16.
Moshiko für MLX (int4, int8, bf16): kyutai/moshiko-mlx-q4, kyutai/moshiko-mlx-q8, kyutai/moshiko-mlx-bf16.
Moshika für Rust/Candle (int8, bf16): kyutai/moshika-candle-q8, kyutai/moshika-mlx-bf16.
Moshiko für Rust/Candle (int8, bf16): kyutai/moshiko-candle-q8, kyutai/moshiko-mlx-bf16.
Alle Modelle werden unter der CC-BY 4.0-Lizenz veröffentlicht.
Sie benötigen mindestens Python 3.10, 3.12 wird empfohlen. Für spezifische Anforderungen schauen Sie bitte in den einzelnen Backend-Verzeichnissen nach. Sie können die PyTorch- und MLX-Clients wie folgt installieren:
pip install moshi # moshi PyTorch, von PyPIpip install moshi_mlx # moshi MLX, von PyPI, am besten mit Python 3.12.# Oder die neuesten Versionen für Moshi und 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, Rust-Implementierung mit Python-Bindungen von PyPI
Wenn Sie Python 3.12 nicht verwenden, erhalten Sie möglicherweise eine Fehlermeldung bei der Installation moshi_mlx
oder rustymimi
(wovon moshi_mlx
abhängt). Anschließend müssen Sie die Rust-Toolchain installieren oder auf Python 3.12 umsteigen.
Obwohl wir hoffen, dass die aktuelle Codebasis unter Windows funktioniert, bieten wir keinen offiziellen Support dafür an. Wir haben die MLX-Version auf einem MacBook Pro M3 getestet. Derzeit unterstützen wir keine Quantisierung für die PyTorch-Version, daher benötigen Sie eine GPU mit einer beträchtlichen Speichermenge (24 GB).
Für die Nutzung des Rust-Backends benötigen Sie eine aktuelle Version der Rust-Toolchain. Um die GPU-Unterstützung zu kompilieren, muss CUDA außerdem ordnungsgemäß für Ihre GPU installiert sein, insbesondere mit nvcc
.
Die PyTorch-basierte API finden Sie im moshi
Verzeichnis. Es bietet eine Streaming-Version des Audio-Tokenizers (Mimi) und des Sprachmodells (Moshi).
Um im interaktiven Modus auszuführen, müssen Sie einen Server starten, auf dem das Modell ausgeführt wird. Anschließend können Sie entweder die Web-Benutzeroberfläche oder einen Befehlszeilen-Client verwenden.
Starten Sie den Server mit:
python -m moshi.server [--gradio-tunnel] [--hf-repo kyutai/moshika-pytorch-bf16]
Und greifen Sie dann auf die Web-Benutzeroberfläche unter localhost:8998 zu. Wenn sich Ihre GPU auf einem entfernten Computer befindet, funktioniert dies nicht, da Websites, die http verwenden, die Audio-Worklet-API nicht verwenden dürfen. Es gibt zwei Möglichkeiten, dies zu umgehen:
Leiten Sie den Remote-Port 8998 mit dem Flag ssh -L
an Ihren lokalen Host weiter. Stellt dann wie zuvor erwähnt eine Verbindung zu localhost:8998 her.
Verwenden Sie das Argument --gradio-tunnel
. Dadurch wird ein Tunnel mit einer URL eingerichtet, auf die von überall aus zugegriffen werden kann. Bedenken Sie, dass dieser Tunnel durch die USA verläuft und zu erheblicher Latenz führen kann (bis zu 500 ms von Europa aus). Sie können --gradio-tunnel-token
verwenden, um ein festes geheimes Token festzulegen und dieselbe Adresse im Laufe der Zeit wiederzuverwenden.
Sie können --hf-repo
verwenden, um ein anderes vorab trainiertes Modell auszuwählen, indem Sie das richtige Hugging Face-Repository festlegen.
Der Zugriff auf einen Server, der nicht localhost ist, über http kann zu Problemen bei der Verwendung des Mikrofons in der Web-Benutzeroberfläche führen (in einigen Browsern ist dies nur über https zulässig).
Ein lokaler Client ist ebenfalls verfügbar, z
python -m moshi.client [--url URL_TO_GRADIO]
Beachten Sie jedoch, dass dieser Client im Gegensatz zum Webbrowser ein Barebone ist: Er führt keine Echounterdrückung durch und versucht auch nicht, eine wachsende Verzögerung durch Überspringen von Frames auszugleichen.
Weitere Informationen, insbesondere zur direkten Verwendung der API, finden Sie unter moshi/README.md.
Sobald Sie moshi_mlx
installiert haben, können Sie es ausführen
python -m moshi_mlx.local -q 4 # Gewichte quantisiert auf 4 Bitspython -m moshi_mlx.local -q 8 # Gewichte quantisiert auf 8 Bits# Und unter Verwendung eines anderen vorab trainierten Modells:python -m moshi_mlx.local -q 4 --hf- repo kyutai/moshika-mlx-q4 python -m moshi_mlx.local -q 8 --hf-repo kyutai/moshika-mlx-q8# Achten Sie darauf, dass die Flags „-q“ und „--hf-repo“ immer übereinstimmen.
Diese Befehlszeilenschnittstelle ist ebenfalls Barebone. Es führt keine Echounterdrückung durch und versucht auch nicht, eine zunehmende Verzögerung durch das Überspringen von Frames auszugleichen.
Alternativ können Sie python -m moshi_mlx.local_web
ausführen, um die Web-Benutzeroberfläche zu verwenden. Die Verbindung erfolgt über http und erfolgt unter localhost:8998.
Um den Rust-Inferenzserver auszuführen, verwenden Sie den folgenden Befehl aus dem rust
-Verzeichnis:
cargo run --features cuda --bin moshi-backend -r -- --config moshi-backend/config.json eigenständig
Wenn Sie macOS verwenden, können Sie --features cuda
durch --features metal
ersetzen.
Alternativ können Sie config-q8.json
anstelle von config.json
verwenden, um das quantisierte q8-Modell zu verwenden. Sie können ein anderes vorab trainiertes Modell, z. B. Moshika, auswählen, indem Sie den Schlüssel "hf_repo"
in einer der Dateien ändern.
Sobald der Server „Standalone Worker Listening“ ausgegeben hat, können Sie die Web-Benutzeroberfläche verwenden. Standardmäßig verwendet der Rust-Server https, sodass er sich unter localhost:8998 befindet.
Sie erhalten Warnungen, dass die Website unsicher ist. Wenn Sie Chrome verwenden, können Sie diese umgehen, indem Sie „Details“ oder „Erweitert“ und dann „Diese unsichere Site besuchen“ oder „Weiter zu Localhost (unsicher)“ auswählen.
Wir empfehlen die Verwendung der Web-Benutzeroberfläche, da sie eine zusätzliche Echounterdrückung bietet, die die Gesamtqualität des Modells verbessert. Beachten Sie, dass die meisten Befehle diese Benutzeroberfläche direkt in der bereitgestellten URL bereitstellen und im Allgemeinen nichts weiter zu tun ist.
Alternativ stellen wir Kommandozeilenschnittstellen für die Rust- und Python-Versionen zur Verfügung, das Protokoll ist das gleiche wie bei der Web-UI, sodass serverseitig nichts geändert werden muss.
Als Referenz finden Sie hier die Liste der Kunden für Moshi.
Führen Sie im rust
-Verzeichnis Folgendes aus:
Cargo run --bin moshi-cli -r --tui --host localhost
python -m moshi.client
Docker komponieren
Erfordert NVIDIA Container Toolkit
Die Web-Benutzeroberfläche kann aus diesem Repo über die folgenden Schritte erstellt werden (dafür muss npm
installiert sein).
CD-Client npm installieren npm run build
Die Web-Benutzeroberfläche finden Sie dann im Verzeichnis client/dist
.
Wenn Sie von einem Klon dieses Repositorys installieren möchten, vielleicht um Moshi weiterzuentwickeln, können Sie Folgendes tun:
# Aus dem Stammverzeichnis des Klons des repopip install -e 'moshi[dev]'pip install -e 'moshi_mlx[dev]'pre-commit install
Wenn Sie rustymimi
lokal erstellen möchten (vorausgesetzt, Sie haben Rust ordnungsgemäß installiert):
pip install maturin maturin dev -r -m rust/mimi-pyo3/Cargo.toml
Schauen Sie sich den Abschnitt „Häufig gestellte Fragen“ an, bevor Sie ein Problem eröffnen.
Der vorliegende Code wird unter der MIT-Lizenz für die Python-Teile und der Apache-Lizenz für das Rust-Backend bereitgestellt. Der Web-Client-Code wird unter der MIT-Lizenz bereitgestellt. Beachten Sie, dass Teile dieses Codes auf AudioCraft basieren, das unter der MIT-Lizenz veröffentlicht wurde.
Die Gewichte für die Modelle werden unter der CC-BY 4.0-Lizenz veröffentlicht.
Wenn Sie entweder Mimi oder Moshi verwenden, zitieren Sie bitte das folgende Dokument:
@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}, }