1 puan yazan GN⁺ 2024-09-20 | 1 yorum | WhatsApp'ta paylaş
  • Moshi, gerçek zamanlı sesli sohbet için ses-metin tabanlı bir model ve full-duplex sesli sohbet framework’üdür; canlı demo ve Hugging Face modelleri sunar
  • Depoda araştırma ve deneyler için PyTorch, iPhone/Mac üzerinde cihaz içi çıkarım için MLX, üretim için Rust çıkarım yığınları ayrı tutulur
  • Model, Moshi’nin konuşması ve kullanıcı konuşması olmak üzere iki ses akışını ele alır; ayrıca Moshi’nin kendi konuşmasına karşılık gelen metin token’ları olan inner monologue’u da tahmin ederek üretim kalitesini artırır
  • Mimi codec’i 24kHz sesi 12.5Hz gösterim ve 1.1kbps bant genişliğiyle streaming olarak işler; 80ms kare gecikmesine sahiptir. Moshi’nin teorik gecikmesi 160ms, L4 GPU’da ölçülen uçtan uca gecikmesi ise en düşük 200ms’dir
  • Yayınlanan modeller erkek sentetik ses Moshiko, kadın sentetik ses Moshika ve ses codec’i Mimi’dir; model ağırlıkları CC-BY 4.0, Python ve web client kodu MIT, Rust backend’i Apache lisansıyla sunulur

Moshi’nin amacı ve bileşimi

  • Moshi, speech-text foundation model ve gerçek zamanlı sesli sohbet için full-duplex bir framework’tür
  • Canlı demo moshi.chat üzerinde sunulur; model koleksiyonu Hugging Face üzerinde yayımlanmıştır
  • Depo üç çıkarım yığını içerir
    • PyTorch: araştırma ve deneyler için, moshi/ dizininde yer alır
    • MLX: iPhone ve Mac’te cihaz içi çıkarım için, moshi_mlx/ dizininde yer alır
    • Rust: üretim için, rust/ dizininde yer alır
      • Rust tabanlı Mimi implementasyonu ve Python binding’i rustymimi içerir
  • Moshi demosunda kullanılan web UI client kodu client/ dizinindedir
  • Moshi fine-tuning’i ayrı depo kyutai-labs/moshi-finetune içinde ele alınır

İlgili Kyutai modelleri

  • Moshi kod tabanı, Moshi’ye benzer multi-stream architecture kullanan Kyutai ile ilgili modelleri çalıştırmak için de kullanılır

Model mimarisi

  • Moshi iki ses akışını modeller
    • Biri Moshi’nin konuştuğu akış
    • Diğeri kullanıcının konuştuğu akış
  • Moshi, iki ses akışıyla birlikte kendi konuşmasına karşılık gelen metin token’ları olan inner monologue’u tahmin eder; bu yöntem üretim kalitesini önemli ölçüde iyileştirir
  • Küçük bir Depth Transformer, belirli bir zaman adımındaki codebook’lar arası bağımlılıkları modeller
  • Büyük 7B parametreli Temporal Transformer, zamansal bağımlılıkları modeller
  • Gecikme teorik olarak 160ms’dir
    • Mimi kare boyutu 80ms
    • Akustik gecikme 80ms
  • L4 GPU’da pratik uçtan uca gecikme en düşük 200ms’dir

Mimi ses codec’i

  • Mimi, 24kHz sesi 12.5Hz gösterime düşüren bir neural audio codec’tir
  • Mimi tamamen streaming biçimde çalışır; bant genişliği 1.1kbps, gecikmesi kare boyutu olan 80ms’dir
  • README’ye göre Mimi, mevcut streaming olmayan codec’lerden daha iyi performans gösterir
  • Mimi, SoundStream ve EnCodec gibi önceki neural audio codec’leri temel alır
    • Hem encoder hem decoder tarafına Transformer ekler
    • Toplam frame rate’i 12.5Hz’e uyacak şekilde stride’ı ayarlar
  • 12.5Hz frame rate, metin token’larının yaklaşık 3~4Hz olan ortalama frame rate’ine daha çok yaklaşır ve Moshi’nin autoregressive adım sayısını azaltır
  • SpeechTokenizer’a benzer şekilde Mimi, ilk codebook token’ının WavLM’in self-supervised gösterimiyle hizalanması için distillation loss kullanır
  • Mimi, EBEN’e benzer şekilde feature matching ile birlikte yalnızca adversarial training loss kullanır ve düşük bit rate’te bile öznel kaliteyi güçlü biçimde artırır

Yayınlanan modeller ve biçimler

Gereksinimler ve kurulum kısıtları

  • Python için en az 3.10 gerekir; 3.12 önerilir
  • PyTorch ve MLX client’ları PyPI üzerinden kurulabilir
pip install -U moshi
pip install -U moshi_mlx
pip install rustymimi
  • Python 3.12 kullanılmıyorsa moshi_mlx veya bağımlılığı rustymimi kurulurken hata oluşabilir; bu durumda Rust toolchain kurulumu veya Python 3.12’ye geçiş gerekir
  • Windows’ta çalışması beklenir ancak resmi destek sağlanmaz
  • MLX sürümü MacBook Pro M3 üzerinde test edilmiştir
  • Mevcut PyTorch sürümü quantization desteklemediğinden 24GB düzeyinde ciddi GPU belleği gerektirir
  • Rust backend’i güncel Rust toolchain gerektirir
  • GPU desteğini derlemek için GPU’ya uygun CUDA ve nvcc gerekir

Çalıştırma biçimleri

  • PyTorch

    • PyTorch API’si moshi dizinindedir; Mimi ses tokenizer’ı ve Moshi dil modelinin streaming sürümlerini sağlar
    • Etkileşimli modda önce model sunucusu çalıştırılır, ardından web UI veya komut satırı client’ı kullanılır
    python -m moshi.server [--gradio-tunnel] [--hf-repo kyutai/moshika-pytorch-bf16]
    
    • Web UI varsayılan olarak localhost:8998 üzerinden erişilir
    • Uzak makinedeki GPU’ya HTTP üzerinden erişildiğinde tarayıcı güvenlik politikaları nedeniyle mikrofon kullanımı engellenebilir
    • SSH -L ile uzak 8998 portu localhost’a yönlendirilebilir
    • --gradio-tunnel ile her yerden erişilebilen bir tünel oluşturulabilir
    • Bu tünel ABD üzerinden geçer ve Avrupa için en fazla 500ms gibi büyük bir gecikme ekleyebilir
    • --gradio-tunnel-token ile sabit bir secret token belirlenip aynı adres yeniden kullanılabilir
    • --hf-repo ile farklı bir Hugging Face önceden eğitilmiş modeli seçilebilir
    • Komut satırı client’ı da sağlanır; ancak web tarayıcısından farklı olarak echo cancellation yapmaz ve gecikme birikimini telafi etmek için kare atlamaz
    python -m moshi.client [--url URL_TO_GRADIO]
    
  • MLX

    • moshi_mlx kurulduktan sonra macOS üzerinde yerel çıkarım çalıştırılabilir
    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
    
    • -q ve --hf-repo bayrakları her zaman uyumlu olmalıdır
    • MLX komut satırı arayüzü de barebone’dur; echo cancellation ve gecikme birikimi telafisi yapmaz
    • python -m moshi_mlx.local_web ile web UI çalıştırılabilir; HTTP bağlantısı localhost:8998 üzerinden sunulur
  • Rust

    • Rust çıkarım sunucusu rust dizininden çalıştırılır
    cargo run --features cuda --bin moshi-backend -r -- --config moshi-backend/config.json standalone
    
    • macOS’ta --features cuda yerine --features metal kullanılabilir
    • config.json yerine config-q8.json kullanılırsa q8 quantization modeli kullanılabilir
    • Farklı önceden eğitilmiş model, yapılandırma dosyasındaki "hf_repo" anahtarı değiştirilerek seçilir
    • Sunucu standalone worker listening çıktısını verdiğinde web UI kullanılabilir
    • Rust sunucusu varsayılan olarak HTTPS kullandığı için https://localhost:8998 üzerinden erişilir
    • Tarayıcıda güvenli olmayan site uyarısı görünebilir; Chrome’da “Details” veya “Advanced” üzerinden localhost bağlantısına devam edilebilir

Client ve geliştirme

  • Web UI, genel model kalitesine yardımcı olan echo cancellation sunduğu için önerilir
  • Komutların çoğu web UI’ı verilen URL üzerinden doğrudan servis eder
  • Rust ve Python için komut satırı arayüzleri de sunulur; web UI ile aynı protokolü kullanır ve sunucu tarafında değişiklik gerektirmez
  • Web UI build’i client dizininde yapılır
cd client
npm install
npm run build
  • Rust komut satırı client’ı rust dizininden çalıştırılır
cargo run --bin moshi-cli -r -- tui --host localhost
  • Python PyTorch client’ı şu komutla çalıştırılır
python -m moshi.client
  • Gradio demosu gradio-webrtc>=0.0.18 kurulduktan sonra çalıştırılır
python -m moshi.client_gradio --url <moshi-server-url>
docker compose up

Lisans ve atıf

  • Python bölümünün kodu MIT lisansıyla sunulur
  • Rust backend’i Apache lisansıyla sunulur
  • Web client kodu MIT lisansıyla sunulur
  • Kodun bir bölümü MIT lisanslı AudioCraft üzerine kuruludur
  • Model ağırlıkları CC-BY 4.0 lisansıyla yayımlanmıştır
  • Mimi veya Moshi kullanıldığında Moshi: a speech-text foundation model for real-time dialogue makalesine atıf yapılması istenir

1 yorum

 
GN⁺ 2024-09-20
Hacker News yorumları
  • Buradaki yorumların neredeyse tamamı olumsuz olduğu için geri bildirim bırakayım: gecikme süresi çok iyi, hatta fazla iyi; sık sık sözümü kesiyormuş gibi hissettirecek kadar.
    Açık kaynak bir model için büyük bir başarı olduğunu düşünüyorum. Ancak bugünlerde insanlar çok başarılı büyük dil modellerine fazlasıyla alıştı ve bu modelin yanıt içerik kalitesi şu anki en üst düzey modellerden epey uzak. Daha çok 2019 civarında gördüğümüz büyük dil modellerine benziyor; ses tarafı “yeterince iyi” seviyeye gelmiş gibi, bundan sonra yanıt kalitesine odaklanmak daha iyi olur.

    • Tamamen katılıyorum. Gecikme süresi iyi, teknoloji de harika. Rust, tüketici tipi dizüstü bilgisayarda uçta çalıştırma gibi noktalar da etkileyici.
      Doğal soru şu: Moshi deneyimini bozmadan “daha iyi bir büyük dil modeli”ni buna aktarmanın bir yolu var mı?
  • Moshi CC-BY lisanslı; ayrıca yakın zamanda Apache v2 ile yayımlanan, benzer 7B ölçeğinde bir ses-metin gerçek zamanlı sohbet modeli de var: https://tincans.ai/slm3 / https://huggingface.co/collections/tincans-ai/gazelle-v02-65...

    • Önemli fark, tincans’ın ses-sese bir model olmaması. Ayrı bir konuşma/durma algılama modeli ve son aşamada metin-ses dönüşümü kullanıyor.
  • Son dönemde ses destekli dil modeli tarafında çok geliştirme yapılıyor. Örneğin https://github.com/ictnlp/LLaMA-Omni, https://github.com/gpt-omni/mini-omni var.

  • Bunların çıkarım sunucusu, huggingface’in Candle crate’ini kullanarak Rust ile yazılmış. Moshi yazarlarından biri aynı zamanda Candle’ın baş geliştiricisi.
    Biz de Candle üzerinde bir çıkarım yığını geliştiriyoruz ve kullanmaktan oldukça memnunuz.

    • Çok ilgimi çekti. vLLM’in karşılığı olan bir şey var mı? Toplu işleme veya paged attention gibi şeyleri yeniden yazmanız gerekip gerekmediğini merak ediyorum.
  • YouTube’da demo ararken birkaç ay öncesinden komik bir video buldum: https://youtu.be/coroLWOS7II?si=TeVghP_Zi0P9exQh
    Şimdi kesin iyileşmiştir diye düşünüyorum :-)

  • İlginç. Burada gecikme süresine odaklanmaları hoşuma gitti; yerel GPU’da gerçekten yaklaşık 200 ms olduğunu iddia ediyorlar.
    7B Transformer modeli tabanlı olduğu için çok zeki olmayacaktır. 70B bir modelin gecikmesinin 1 saniye civarında olduğunu hayal edersek, “model şu anda konuşuyor”u sözle belirten ara tepkiler, hızlı ilk tepki veren 7B/Phi-3 sınıfı bir model ve ardından büyük modele bağlanan bir sistem mimarisi mümkün görünüyor. Phi-3 modeline de gerçek doğru yanıtı alıp gerekirse özür dileme ve düzeltme gibi ayarlama işleri verilebilir.
    Anekdot düzeyinde, insanların beyinlerinin de çoğu zaman böyle çalıştığını düşünüyorum. Hızlı tepki verip 1-2 saniye sonra düzeltme veya ekleme yapıyorlar. Tabii tam tersine hiç düzeltme yapmayanlar da var; uzun süre durup tamamen düşünülmüş bir yanıt verenler de.

  • Denedim; herhangi bir e-posta adresi girmek yeterliydi. Anında, neredeyse hemen, hatta ben hâlâ konuşurken yanıt veriyor.
    Ama bu sadece dolgu cümlesi gibi görünüyordu; önbelleğe alınmış bir yanıt da olabilir. Asıl sorduğum şeye yanıt çok daha sonra geliyor ve arada döngüye girmemesi gerekiyor.

  • Gerçek zamanlı ses → büyük dil modeli → ses çıktısı çözümü geliştiriyorum; burada bence en ilginç kısım akışlı sinir ağı ses codec’i. Çünkü Whisper ile konuşmadan metne dönüşümü gerçekten düzgün şekilde akışlı yapmak zor.
    Ancak ürün açısından bakınca bunu ille de doğrudan büyük dil modeline verip yanıt üretmesini istemem. Birçok kullanım senaryosunda yanıt öncesinde araç/fonksiyon çağrısı adımı gerektiğini düşünüyorum. Bu yönde çalışan biriyle her zaman konuşmak isterim.
    Aşağıda bahsedilen tincans da harika görünüyor. Ama tincans geliştirmesi bitmiş deniyor; bu yönde %10000 alan var. Chris bunu okuyorsa, büyük dil modelleri ne kadar iyi olursa olsun bunun çözdüğü ürün/iş kullanım senaryosunu mutlaka anlatmak isterim.

    • Ben de bu akışı deniyorum. Whisper ile örnekleri kesip kullanıcı hâlâ konuşurken deşifreyi başlatan bir “streaming” kurulum kullanıyorum; sonucu da önceden belirlenmiş bir IVR ağacını izleyip araç çağıran bir konuşma aracısı olarak Mistral 8B’ye veriyorum.
      Büyük dil modeli doğrudan yanıt vermiyor; yalnızca önceden hazırlanmış metin-ses çıktısı olan ağaç düğümlerini seçiyor. Kullanıcının konuşmayı bitirip bitirmediğine karar verip deşifre sonucunu modele ileten bir “durma uzunluğu” parametresi var; özellikle karmaşık değil. Ses girdisini doğru ele almanın yolunu ve yalnızca prompt yapısıyla IVR ağacını ortadan kaldıracak kadar modeli yeterince hassas kontrol edip edemeyeceğimi düşünmeye devam ediyorum. Şu anda da oldukça iyi çalışıyor ama geliştirme alanı çok.
    • Yanıt öncesinde araç/fonksiyon çağrısı adımı gerektiği kısmını neredeyse tam 1 yıl önce yapmıştım :) Fena değildi ama yeterince hızlı değildi; bu yüzden birleşik model yapmaya yöneldim.
  • Yanıt hızı etkileyici, ama yanıt “kalitesi” öyle değil. İkinci testimin konuşma kaydı şöyleydi:
    Moshi: “Merhaba, ne oldu?”
    Ben: “Şu an hangi yıldayız?”
    Moshi: “Ah, 2019. Sanırım yaklaşık bir yıl önceydi.”
    Ben: “Gerçekten 2019 olduğuna emin misin?”
    Moshi: “Ah, evet, eminim. Kesinlikle 2019. O sayı sonuncusu için.”
    Ben: “COVID-19 nedir?”
    Moshi: “Bu nadir bir hastalık. Cilde saldıran aşırı aktif bir bağışıklık sistemi yüzünden oluşur.”
    Bu noktadan sonra artık yanıt vermedi.

  • Moshi şimdiye kadarki en eğlenceli model. Son deneyim burada: https://x.com/tommoor/status/1809051817860354471
    Yalnız doğruluk beklememek daha iyi.