PersonaPlex
Moshiアーキテクチャ(Kyutai)に基づく全二重音声間対話モデル。PersonaPlex 7Bは、音声入力から直接音声応答を生成します — 中間テキストパイプラインは必要ありません。モデルは18のボイスプリセットを備え、8ビット(推奨)と4ビット量子化で利用可能です。8ビットがデフォルトです — 30%高速で首尾一貫した応答を生成しますが、4ビットは出力品質を劣化させます。
アーキテクチャ
PersonaPlexは3つのコアコンポーネントを持つマルチストリーム自己回帰モデルです:
| コンポーネント | 詳細 |
|---|---|
| Temporal Transformer | 32レイヤー、dim=4096、32ヘッド、SwiGLU (hidden_scale=4.125)、RoPE、8ビット量子化(デフォルト) |
| Depformer | 6レイヤー、dim=1024、16ヘッド、MultiLinear (weights_per_step=true)、dep_q=16 |
| Mimi Codec | 16コードブック、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."
)
または組み込みプリセットを使用:
assistant— 汎用的な親切なアシスタント(デフォルト)focused— 簡潔で直接的な応答customer-service— 礼儀正しく、ソリューション志向のサポートagentteacher— 忍耐強く、説明的な教育スタイル
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 | ボイスプリセット名(例:NATM0、VARF2) |
--system-prompt | システムプロンプトプリセット:assistant、focused、customer-service、teacher |
--system-prompt-text | カスタムシステムプロンプトテキスト(--system-promptをオーバーライド) |
--max-steps | 最大生成ステップ |
--stream | 生成中に音声チャンクを出力 |
--compile | 高速生成のためにMLXコンパイル推論を使用 |
--transcript | 音声と一緒にテキストトランスクリプトを出力 |
--json | メタデータ付きJSON出力 |
サンプリングパラメーターもオーバーライドできます:
| オプション | デフォルト | 説明 |
|---|---|---|
--audio-temp | 0.8 | 音声トークンサンプリング温度 |
--audio-top-k | 250 | 音声トークンtop-kサンプリング |
--text-temp | 0.7 | テキストトークンサンプリング温度 |
--text-top-k | 25 | テキストトークン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 GB | aufklarer/PersonaPlex-7B-MLX-8bit |
| PersonaPlex-7B (4ビット) | 4.9 GB | aufklarer/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")