- Moshi adalah model berbasis suara-teks untuk percakapan suara real-time sekaligus framework percakapan suara full-duplex, dengan demo live dan model Hugging Face yang tersedia
- Repositori ini memisahkan stack inferensi PyTorch untuk riset dan eksperimen, MLX untuk inferensi on-device di iPhone/Mac, serta Rust untuk produksi
- Model menangani dua stream audio, yaitu ujaran Moshi dan ujaran pengguna, serta memprediksi inner monologue, token teks yang sesuai dengan ujaran Moshi sendiri, untuk meningkatkan kualitas generasi
- Codec Mimi memproses audio 24kHz secara streaming menjadi representasi 12,5Hz dengan bandwidth 1,1kbps, memiliki latensi frame 80ms, sementara latensi teoretis Moshi adalah 160ms dan latensi total terukur di GPU L4 paling rendah 200ms
- Model yang dirilis mencakup suara sintetis laki-laki Moshiko, suara sintetis perempuan Moshika, dan codec suara Mimi; bobot model tersedia dengan lisensi CC-BY 4.0, kode Python dan klien web dengan MIT, serta backend Rust dengan lisensi Apache
Tujuan dan komponen Moshi
- Moshi adalah speech-text foundation model sekaligus framework full-duplex untuk percakapan suara real-time
- Demo live tersedia di moshi.chat, dan koleksi model dipublikasikan di Hugging Face
- Repositori ini mencakup tiga stack inferensi
- PyTorch: untuk riset dan eksperimen, berada di direktori
moshi/
- MLX: untuk inferensi on-device di iPhone dan Mac, berada di direktori
moshi_mlx/
- Rust: untuk produksi, berada di direktori
rust/
- Mencakup implementasi Mimi berbasis Rust dan binding Python
rustymimi
- Kode klien UI web yang digunakan pada demo Moshi berada di direktori
client/
- Fine-tuning Moshi ditangani di repositori terpisah kyutai-labs/moshi-finetune
Model Kyutai terkait
- Codebase Moshi juga digunakan untuk menjalankan model terkait Kyutai yang memakai multi-stream architecture mirip Moshi
Arsitektur model
- Moshi memodelkan dua stream audio
- Satu stream adalah Moshi yang berbicara
- Stream lainnya adalah pengguna yang berbicara
- Bersama dua stream audio tersebut, Moshi memprediksi inner monologue, yaitu token teks yang sesuai dengan ujarannya sendiri; pendekatan ini secara signifikan meningkatkan kualitas generasi
- Depth Transformer kecil memodelkan dependensi antar-codebook pada langkah waktu tertentu
- Temporal Transformer besar dengan 7B parameter memodelkan dependensi temporal
- Secara teoretis, latensinya 160ms
- Ukuran frame Mimi 80ms
- Latensi akustik 80ms
- Latensi total praktis pada GPU L4 paling rendah 200ms
Codec suara Mimi
- Mimi adalah codec audio neural yang menurunkan audio 24kHz menjadi representasi 12,5Hz
- Mimi bekerja sepenuhnya secara streaming, dengan bandwidth 1,1kbps dan latensi sebesar ukuran frame, yaitu 80ms
- Berdasarkan README, Mimi berkinerja lebih baik dibanding codec non-streaming yang ada sebelumnya
- Mimi didasarkan pada codec audio neural sebelumnya seperti SoundStream dan EnCodec
- Menambahkan Transformer pada encoder dan decoder
- Menyesuaikan stride agar frame rate keseluruhan menjadi 12,5Hz
- Frame rate 12,5Hz lebih mendekati frame rate rata-rata token teks, yaitu sekitar 3–4Hz, dan mengurangi jumlah langkah autoregresif Moshi
- Mirip dengan SpeechTokenizer, Mimi menggunakan distillation loss agar token codebook pertama selaras dengan representasi self-supervised dari WavLM
- Seperti EBEN, Mimi hanya menggunakan adversarial training loss bersama feature matching, sehingga kualitas subjektif meningkat kuat bahkan pada bitrate rendah
Model yang dirilis dan formatnya
- Ada tiga model yang dirilis
- Moshiko: Moshi yang di-fine-tune dengan suara sintetis laki-laki
- Moshika: Moshi yang di-fine-tune dengan suara sintetis perempuan
- Mimi: codec suara
- Format file dan kuantisasi yang tersedia berbeda tergantung backend
- Mimi dibundel di setiap model dan selalu menggunakan format checkpoint yang sama
- Model PyTorch
- Model MLX
- Model Rust/Candle
- Semua model dirilis dengan lisensi CC-BY 4.0
Persyaratan dan batasan instalasi
- Python minimal 3.10 diperlukan, dan 3.12 direkomendasikan
- Klien PyTorch dan MLX dapat diinstal dari PyPI
pip install -U moshi
pip install -U moshi_mlx
pip install rustymimi
- Jika bukan Python 3.12, instalasi
moshi_mlx atau dependensinya rustymimi dapat gagal; dalam kasus ini, perlu menginstal Rust toolchain atau beralih ke Python 3.12
- Diharapkan berjalan di Windows, tetapi tidak ada dukungan resmi yang diberikan
- Versi MLX telah diuji pada MacBook Pro M3
- Versi PyTorch saat ini tidak mendukung kuantisasi, sehingga membutuhkan memori GPU yang cukup besar, sekitar 24GB
- Backend Rust membutuhkan Rust toolchain terbaru
- Untuk mengompilasi dukungan GPU, diperlukan CUDA yang sesuai dengan GPU dan
nvcc
Cara menjalankan
-
PyTorch
- API PyTorch berada di direktori
moshi, dan menyediakan versi streaming dari tokenizer audio Mimi serta model bahasa Moshi
- Mode interaktif menjalankan server model terlebih dahulu, lalu menggunakan UI web atau klien baris perintah
python -m moshi.server [--gradio-tunnel] [--hf-repo kyutai/moshika-pytorch-bf16]
- UI web secara default dapat diakses di
localhost:8998
- Jika mengakses GPU mesin remote lewat HTTP, penggunaan mikrofon dapat diblokir karena kebijakan keamanan browser
- Port remote 8998 dapat diteruskan ke localhost dengan SSH
-L
--gradio-tunnel dapat membuat tunnel yang bisa diakses dari mana saja
- Tunnel ini melewati AS dan dapat menambahkan latensi besar hingga 500ms untuk Eropa
--gradio-tunnel-token dapat menetapkan secret token tetap dan menggunakan kembali alamat yang sama
--hf-repo dapat digunakan untuk memilih model pretrained Hugging Face lain
- Klien baris perintah juga disediakan, tetapi berbeda dengan browser web, tidak melakukan echo cancellation dan juga tidak melewati frame untuk mengompensasi akumulasi latensi
python -m moshi.client [--url URL_TO_GRADIO]
-
MLX
- Setelah menginstal
moshi_mlx, inferensi lokal macOS dapat dijalankan
python -m moshi_mlx.local -q 4
python -m moshi_mlx.local -q 8
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
- Flag
-q dan --hf-repo harus selalu disesuaikan
- Antarmuka baris perintah MLX juga barebone dan tidak melakukan echo cancellation maupun kompensasi akumulasi latensi
- UI web dapat dijalankan dengan
python -m moshi_mlx.local_web, dan koneksi HTTP disediakan di localhost:8998
-
Rust
- Server inferensi Rust dijalankan dari direktori
rust
cargo run --features cuda --bin moshi-backend -r -- --config moshi-backend/config.json standalone
- Di macOS,
--features metal dapat digunakan sebagai pengganti --features cuda
- Jika memakai
config-q8.json alih-alih config.json, model kuantisasi q8 dapat digunakan
- Model pretrained lain dipilih dengan mengubah key
"hf_repo" di file konfigurasi
- Setelah server menampilkan
standalone worker listening, UI web dapat digunakan
- Server Rust menggunakan HTTPS secara default, sehingga diakses di
https://localhost:8998
- Peringatan situs tidak aman mungkin muncul di browser; di Chrome, akses localhost dapat dilanjutkan melalui “Details” atau “Advanced”
Klien dan pengembangan
- UI web direkomendasikan karena menyediakan echo cancellation yang membantu kualitas model secara keseluruhan
- Sebagian besar perintah menyajikan UI web langsung dari URL yang diberikan
- Antarmuka baris perintah untuk Rust dan Python juga disediakan, dan menggunakan protokol yang sama dengan UI web sehingga tidak memerlukan perubahan di sisi server
- Build UI web dilakukan di direktori
client
cd client
npm install
npm run build
- Klien baris perintah Rust dijalankan dari direktori
rust
cargo run --bin moshi-cli -r -- tui --host localhost
- Klien Python PyTorch dijalankan dengan perintah berikut
python -m moshi.client
- Demo Gradio dijalankan setelah menginstal
gradio-webrtc>=0.0.18
python -m moshi.client_gradio --url <moshi-server-url>
docker compose up
Lisensi dan sitasi
- Kode bagian Python tersedia dengan lisensi MIT
- Backend Rust tersedia dengan lisensi Apache
- Kode klien web tersedia dengan lisensi MIT
- Sebagian kode didasarkan pada AudioCraft berlisensi MIT
- Bobot model dirilis dengan lisensi CC-BY 4.0
- Jika menggunakan Mimi atau Moshi, diminta untuk mengutip paper
Moshi: a speech-text foundation model for real-time dialogue
1 komentar
Komentar Hacker News
Karena hampir semua komentar di sini negatif, saya ingin memberi umpan balik: latensi-nya sangat bagus—malah terlalu bagus sampai sering terasa seperti memotong pembicaraan
Menurut saya ini pencapaian besar untuk model open source. Namun, orang-orang sekarang sudah terbiasa dengan model bahasa besar yang sangat hebat, sementara kualitas isi jawaban model ini masih jauh dari model terbaik saat ini. Rasanya lebih mirip model bahasa besar yang saya lihat sekitar 2019; jadi sisi audionya sudah mencapai tingkat “cukup baik”, dan ke depan sebaiknya fokus pada kualitas jawaban
Pertanyaan wajarnya adalah apakah ada cara untuk memindahkan “model bahasa besar yang lebih baik” tanpa merusak pengalaman Moshi
Moshi berlisensi CC-BY, dan baru-baru ini ada model percakapan real-time suara-ke-teks berukuran 7B yang mirip dan dirilis dengan Apache v2: https://tincans.ai/slm3 / https://huggingface.co/collections/tincans-ai/gazelle-v02-65...
Belakangan ini makin banyak pengembangan di area model bahasa yang mendukung suara. Contohnya https://github.com/ictnlp/LLaMA-Omni, https://github.com/gpt-omni/mini-omni
Server inferensi mereka ditulis dalam Rust menggunakan crate Candle dari huggingface. Salah satu penulis Moshi juga merupakan penulis utama Candle
Kami juga sedang membangun stack inferensi di atas Candle, dan sejauh ini cukup puas menggunakannya
Saat mencari demo di YouTube, saya menemukan video lucu dari beberapa bulan lalu: https://youtu.be/coroLWOS7II?si=TeVghP_Zi0P9exQh
Saya yakin sekarang sudah membaik :-)
Menarik. Saya suka bahwa mereka berfokus pada latensi di sini, dan mengklaim sekitar 200 ms di GPU lokal
Karena berbasis model transformer 7B, kemungkinan tidak akan sangat pintar. Jika membayangkan latensi model 70B sekitar 1 detik, tampaknya mungkin dibuat arsitektur sistem dengan respons sementara yang memberi tahu secara verbal bahwa “model sedang berbicara”, model kelas 7B/Phi-3 untuk respons awal yang cepat, lalu dilanjutkan oleh model besar. Model Phi-3 juga bisa diberi tugas penyesuaian untuk menerima jawaban yang benar dan, jika perlu, meminta maaf lalu mengoreksi
Secara anekdotal, menurut saya otak manusia pun sering bekerja seperti itu. Bereaksi cepat lalu mengoreksi atau melengkapi 1–2 detik kemudian. Tentu ada juga orang yang sebaliknya sama sekali tidak mengoreksi, atau berhenti lama lalu memberikan jawaban yang benar-benar dipikirkan matang-matang
Saya sudah mencobanya, dan alamat email apa pun bisa dimasukkan. Jawabannya langsung, hampir seketika, bahkan saat saya masih berbicara
Tapi itu terlihat seperti kalimat pengisi, dan mungkin juga seperti jawaban yang di-cache. Jawaban atas hal yang benar-benar ditanyakan muncul jauh setelahnya, dan modelnya harus tidak terjebak loop di tengah jalan
Saya sedang membuat solusi real-time suara → model bahasa besar → keluaran suara, dan menurut saya bagian paling menarik di sini adalah codec audio neural streaming. Sebab dengan Whisper, streaming suara-ke-teks yang benar-benar baik sulit dilakukan
Namun dari sudut pandang produk, saya belum tentu ingin memasukkannya langsung ke model bahasa besar untuk menjawab. Dalam banyak use case, menurut saya dibutuhkan tahap pemanggilan tool/fungsi sebelum jawaban. Saya selalu tertarik berbicara dengan siapa pun yang mengerjakan arah ini
tincans yang disebutkan di bawah juga terlihat bagus. Namun karena katanya pengembangan tincans sudah selesai, masih ada ruang 10000% di arah ini. Jika Chris membaca ini, saya ingin sekali menjelaskan use case produk/bisnis yang diselesaikan hal ini, tak peduli seberapa bagus model bahasa besar nantinya
Model bahasa besar tidak menjawab secara langsung, hanya memilih node pohon yang memiliki keluaran teks-ke-suara yang sudah disiapkan. Ada parameter “panjang jeda” untuk menentukan apakah pengguna sudah selesai berbicara sebelum hasil transkripsi dikirim ke model, dan itu tidak terlalu rumit. Saya masih terus memikirkan cara menangani input audio dengan benar, atau apakah model bisa dikendalikan cukup presisi hanya lewat penyusunan prompt sampai pohon IVR bisa dihilangkan. Saat ini sudah berjalan cukup baik, tetapi masih banyak ruang untuk perbaikan
Kecepatan respons-nya mengesankan, tetapi “kualitas” jawabannya tidak. Log percakapan dari tes kedua saya seperti ini
Moshi: “Halo, ada apa?”
Saya: “Sekarang tahun berapa?”
Moshi: “Oh, ini tahun 2019. Sepertinya mungkin sekitar setahun yang lalu.”
Saya: “Benarkah ini tahun 2019?”
Moshi: “Oh, ya, saya yakin. Pasti 2019. Angka itu untuk yang terakhir.”
Saya: “Apa itu COVID-19?”
Moshi: “Itu penyakit langka. Disebabkan oleh sistem imun yang terlalu aktif yang menyerang kulit.”
Pada titik ini, ia tidak menjawab lagi
Moshi adalah model paling menyenangkan sejauh ini. Pengalaman terbaru ada di sini: https://x.com/tommoor/status/1809051817860354471
Namun sebaiknya jangan berharap pada akurasi