😽

声と役割を指定できる同時双方向的な音声対話

に公開

今回はXでも話題ともなったNVIDIA社のPersonaPlexについて紹介します!
ひとことで述べるとPersonaPlexは「様々なキャラと対話できるAI」です。

背景:同時双方向的な音声対話

巷では「リアルな会話ができるぞ!」と注目されていたりもしますが、実は同時双方向的な音声対話の研究はこれが初めてではありません。PersonaPlexは一世代前のMoshiというモデルに基づいています。

Moshiについて

Moshiはfull-duplex(同時双方向的)な音声基盤モデルです。開発元はkyutaiというパリのAIラボです。最近もPocketTTSのリリースで注目されていました。Moshiは①Mimiというneural audio codec, ②Heliumという多言語LLM, ③小規模なDepth Transformerから構成されます。


[Defossez et al.. 2024]のFig.1 (リンク:https://arxiv.org/pdf/2410.00037)

J-Moshiについて

Moshiは日本語版も開発されています。それが名古屋大学のチームによるJ-Moshiです。公式リポジトリがこちらにあり、学習データの一覧などが記されています。学習では128基のNVIDIA V100 32GB GPUを使用したとのことで, LLMと比較すると意外と手の届く(かもしれない?)計算資源のようです。

PersonaPlexは何が新しいのか?

本研究(Roy et al., 2026)の何が新しいのかというと、これまではAIの役割や声が固定されていたのに対し、より現実のシチュエーションなどで柔軟に活用できるように改良した点にあります。テキストによるプロンプトで役割(ロール)を指定し、ボイスクローニングを活用して声を指定できます。ペルソナ(Persona)と名付けられている所以でもあります。

とはいえテキストでのシステムプロンプトはLLMでお馴染みです。PersonPlexで更に特徴的と言えるのは、以下の図にあるように、Voice promptとText promptを一緒くたに繋げてLLMに突っ込んでる構造です。論文中でも"multimodal"と度々称されていますが、音声とテキストという異ドメインを一緒くたに扱うという、時代の流れに沿ったアプローチとなっていました。
元々音声を如何にしてLLMに突っ込むかという研究を盛んにしてきたKyutAI(Moshi, Mimi等)にとっては、自然な発想であったのかもしれません。


[Roy et al., 2026] Fig.1 (リンク:https://research.nvidia.com/labs/adlr/files/personaplex/personaplex_preprint.pdf)

一点補足すると、J-MoshiはCC BY-NC 4.0ライセンスであるのに対し、PersonaPlexはコードはMITライセンス・学習済みモデル等もNVIDIA Open Licenseと商用利用に対する制約が大きく異なります。

事前準備

PersonaplexのモデルはGatedです。Huggingfaceにアクセスし、申請を済ませておいてください。その後、Huggingface User Access Tokenを発行しておきましょう。Read権限で十分です。

手順

  1. まず公式リポジトリをクローンしてきます。

  2. 環境構築を行います。今回はSingularityを利用しました。Singularityのdefファイルを以下添付しますので、コピペでご利用ください。

Bootstrap: docker
From: nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04

%environment
    export LANG=C.UTF-8
    export LC_ALL=C.UTF-8
    export PYTHONUNBUFFERED=1
    export PIP_NO_CACHE_DIR=1
    export HF_HOME=/opt/hf
    export TRANSFORMERS_CACHE=/opt/hf
    export TORCH_HOME=/opt/torch
    export PYTHONPATH=/opt/personaplex:${PYTHONPATH}

%files
    moshi/moshi/server.py /opt/server.py
    moshi/moshi/models/loaders.py /opt/loaders.py

%post
    set -eux

    # ---- OS deps ----
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        ca-certificates \
        git \
        curl \
        wget \
        build-essential \
        pkg-config \
        python3 \
        python3-pip \
        python3-venv \
        python3-dev \
        ffmpeg \
        libsndfile1 \
        sox \
        libsox-fmt-all \
        openssl \
        tini
    rm -rf /var/lib/apt/lists/*

    # ---- Python tooling ----
    python3 -m pip install --upgrade pip setuptools wheel

    # ---- Install PyTorch (CUDA 12.1 wheels) ----
    # If you need a different CUDA wheel (e.g., cu128 for Blackwell), reinstall at runtime.
    python3 -m pip install --index-url https://download.pytorch.org/whl/cu121 \
        torch torchvision torchaudio torchao 
    python3 -m pip install fastapi uvicorn[standard] scipy websockets
    

    # ---- Fetch repo & install moshi ----
    mkdir -p /opt
    cd /opt
    git clone --depth 1 https://github.com/NVIDIA/personaplex.git
    cd /opt/personaplex
    cp /opt/server.py /opt/personaplex/moshi/moshi/server.py
    cp /opt/loaders.py /opt/personaplex/moshi/moshi/models/loaders.py
    

    # README says: pip install moshi/.  (installs the Python package "moshi")
    python3 -m pip install moshi/.

    # Create caches dirs (writable locations can be bind-mounted if desired)
    mkdir -p /opt/hf /opt/torch

    # Convenience: show installed versions
    python3 -c "import torch; print('torch:', torch.__version__, 'cuda:', torch.version.cuda)"

%runscript
    set -e

    if [ -z "${HF_TOKEN:-}" ]; then
        echo "ERROR: HF_TOKEN is not set."
        echo "Set it like: HF_TOKEN=xxxxx apptainer run --nv personaplex.sif"
        exit 1
    fi

    # Run the live server (README: python -m moshi.server --ssl \"$(mktemp -d)\" )
    # Bind to all interfaces for remote access in HPC environments.
    SSL_DIR="$(mktemp -d)"
    exec tini -g -- python3 -m moshi.server --host 0.0.0.0 --port 8998 --ssl "${SSL_DIR}"
  1. 以下のコマンドを実行し、サーバを起動します。
HF_TOKEN="<YOUR_HF_TOKEN>" \
    singularity run --nv -B $HOME/.cache/huggingface:/opt/hf dev.sif
  1. ポート番号などがデフォルト設定のままであれば、0.0.0.0:8998 をブラウザで開きます。ログに表示されると思いますので、それをクリックする形でもOKです。以下のような画面が現れます。

Text Prompt: で役割(role)を指定できます。4種類の例が提供されていますのでこれをクリックしてもOKです。
一方, Voiceでは多様な音声の種類を選べます。Fがつくものが女性の声、Mがつくものが男性の声です。

Connect をクリックすると以下のようなページに遷移し、AIとおしゃべりができます!
親切に右側には字幕も表示されます。(英会話の練習に良いかも。)

まとめ

数十GBメモリのGPU環境さえあれば、手元でも高性能な対話AI(ただし英語に限定)が自由に使える時代になってまいりました。英語の音声生成AIモデルやTTS(Text-to-Speech)モデルは発音がネイティブすぎて圧倒されますね、、、是非遊んでみてください!

おわりに

EQUESでは引き続き、「最先端の機械学習技術をあやつり社会の発展を加速する」をミッションに研究開発と社会実装に取り組んでいきます。一緒に事業を創出する仲間を募集しています。詳しくは以下をご覧ください。

https://www.wantedly.com/companies/company_6691299

Discussion