PersonaPlex

Moshiアーキテクチャ(Kyutai)に基づく全二重音声間対話モデル。PersonaPlex 7Bは、音声入力から直接音声応答を生成します — 中間テキストパイプラインは必要ありません。モデルは18のボイスプリセットを備え、8ビット(推奨)と4ビット量子化で利用可能です。8ビットがデフォルトです — 30%高速で首尾一貫した応答を生成しますが、4ビットは出力品質を劣化させます。

アーキテクチャ

PersonaPlexは3つのコアコンポーネントを持つマルチストリーム自己回帰モデルです:

コンポーネント詳細
Temporal Transformer32レイヤー、dim=4096、32ヘッド、SwiGLU (hidden_scale=4.125)、RoPE、8ビット量子化(デフォルト)
Depformer6レイヤー、dim=1024、16ヘッド、MultiLinear (weights_per_step=true)、dep_q=16
Mimi Codec16コードブック、12.5 Hzフレームレート、24 kHz音声出力

モデルは17ストリームを同時に処理します:1テキストストリーム + 8ユーザー音声ストリーム + 8agent音声ストリーム。このアーキテクチャにより、モデルが同時に聞いて話すことができる全二重会話が可能になります。

ボイスプリセット

PersonaPlexには、自然で多様なスタイルにわたる18の組み込みボイスプリセットが含まれています:

カテゴリプリセット
ナチュラル女性NATF0, NATF1, NATF2, NATF3
ナチュラル男性NATM0, NATM1, NATM2, NATM3
バリード女性VARF0, VARF1, VARF2, VARF3, VARF4
バリード男性VARM0, VARM1, VARM2, VARM3, VARM4

インナーモノローグ

PersonaPlexは各ステップで2つの並列ストリームを生成します:Mimiコーデック用の8つの音声コードブックトークンと、モデルの内部モノローグ用の1つのテキストトークン。テキストストリームは、モデルが話すときに「考えている」ことです — 最終音声から少し発散する可能性がありますが、実際にはライブトランスクリプトとして使用できるほど話された応答と密接に反映します。

テキストトークンは生のSentencePieceピースIDとして返されます。PersonaPlexに同梱されているSentencePieceDecoderでデコードしてください:

import PersonaPlex
import AudioCommon

let model = try await PersonaPlexModel.fromPretrained()
let decoder = try model.makeTextDecoder()  // SentencePieceDecoder

let result = model.respondWithTranscript(userAudio: userSamples, voice: .NATM0)
let transcript = decoder.decode(result.textTokens)
print(transcript)        // "Sure, I can help with that..."
playAudio(result.audio)  // 24 kHz モノラル Float32

ストリーミングモードでは、respondStreamが生成されるにつれてtextTokensチャンクを出力します — 音声がまだ生成中の間にライブキャプションビューを駆動するために、それらを増分的にデコードします。--transcript CLIフラグは、まさにこれを舞台裏で行います。

なぜ重要か: SentencePieceDecoderは共有のAudioCommon.SentencePieceModel protobufリーダー上に構築されているため、PersonaPlex、OmnilingualASR、および将来のSentencePieceベースのモデルはすべて、同じトークナイザー実装を通じてデコードします。SentencePieceModelリファレンスを参照してください。

システムプロンプト

カスタムシステムプロンプトをプレーンな文字列として渡します — 外部トークン化は不要:

let response = model.respond(
    userAudio: audio,
    voice: .NATM0,
    systemPrompt: "You enjoy having a good conversation."
)

または組み込みプリセットを使用:

CLIの使用法

音声入力から音声応答を生成します:

# 基本的な音声間変換
.build/release/audio respond --input question.wav

# ボイスプリセットを選択
.build/release/audio respond --input question.wav --voice NATM0

# 生成中に音声出力をストリーミング
.build/release/audio respond --input question.wav --stream

# カスタムシステムプロンプトテキスト
.build/release/audio respond --input question.wav --system-prompt-text "You enjoy having a good conversation."

# プリセットシステムプロンプトを使用
.build/release/audio respond --input question.wav --system-prompt customer-service

# 音声と一緒にトランスクリプトを取得
.build/release/audio respond --input question.wav --transcript

# メタデータ付きJSON出力
.build/release/audio respond --input question.wav --json

オプション

オプション説明
--input入力音声ファイル(WAV、必須)
--voiceボイスプリセット名(例:NATM0VARF2
--system-promptシステムプロンプトプリセット:assistant、focused、customer-service、teacher
--system-prompt-textカスタムシステムプロンプトテキスト(--system-promptをオーバーライド)
--max-steps最大生成ステップ
--stream生成中に音声チャンクを出力
--compile高速生成のためにMLXコンパイル推論を使用
--transcript音声と一緒にテキストトランスクリプトを出力
--jsonメタデータ付きJSON出力

サンプリングパラメーターもオーバーライドできます:

オプションデフォルト説明
--audio-temp0.8音声トークンサンプリング温度
--audio-top-k250音声トークンtop-kサンプリング
--text-temp0.7テキストトークンサンプリング温度
--text-top-k25テキストトークンtop-kサンプリング

ストリーミング

--streamフラグはリアルタイム音声出力を有効にします。音声チャンクは生成されるにつれて出力されるため、完全な応答が完了する前に再生を開始できます。これは、低レイテンシーが重要なインタラクティブアプリケーションで特に有用です。

パフォーマンス

指標
リアルタイム係数 (RTF)約1.4(8ビット、ほぼリアルタイム)
ステップレイテンシーM2 Max上で約112 ms/ステップ(8ビット)
モデルサイズ(8ビット)約9.1 GB
ピークRAM(8ビット)約11 GB
モデルサイズ(4ビット)約4.9 GB
ピークRAM(4ビット)約7 GB
重要

PersonaPlex 7B(8ビット)は少なくとも24 GBのRAMを必要とします。4ビットバリアントは16 GBデバイスに収まりますが、劣化した出力を生成します。8 GBデバイスでは、どちらのバリアントも収まりません。サポートされているハードウェアで最高のパフォーマンスを得るには--compileを使用してください。

モデルバリアント

モデルサイズHuggingFace
PersonaPlex-7B (8ビット) 推奨9.1 GBaufklarer/PersonaPlex-7B-MLX-8bit
PersonaPlex-7B (4ビット)4.9 GBaufklarer/PersonaPlex-7B-MLX-4bit

Swift API

import PersonaPlex

let model = try await PersonaPlexModel.loadFromHub()
let response = try await model.respond(
    audioFile: "question.wav",
    voice: .NATM0,
    systemPrompt: .assistant
)
try response.audio.write(to: "answer.wav")