「誰がいつ話したか」を音声ストリームからリアルタイムで識別するリアルタイム話者ダイアライゼーション「diart」を動かす

初めに

リアルタイム話者ダイアライゼーションのためのPythonフレームワークです。「誰がいつ話したか」を音声ストリームからリアルタイムで識別します。

開発環境

環境構築

システム依存関係をインストールします

brew install portaudio libsndfile ffmpeg

プロジェクトの公式推奨しているため,Python 3.10 仮想環境の作成をします

uv venv --python 3.10
source .venv/bin/activate

次にdiartのインストールします

uv pip install -e .
uv pip install -e ".[tests]"

3までのライブラリをインストールしただけだと依存関係のエラーになったため,以下の対応を入れました

uv pip install "pyannote.audio<3.1"
uv pip install "torchaudio>=2.0.2,<2.1"
uv pip install "torchvision==0.15.2"
uv pip install "pytorch-lightning>=2.0,<2.1"
uv pip install "huggingface_hub<1.0"

また以下の二つは事前に申請をしておきます

huggingface.co

実行

マイクからリアルタイムで実行する場合は,以下のコマンドを実行します

diart.stream microphone

今回は複数話者の話者分離として複数人が話している動画を使って実行しました。

diart.stream 音声ファイルのパス

以下のようなGUIで可視化されます

静止画像を3Dパララックス効果のある動画に変換するDepthFlowをWindowsでGraido経由で動かす

初めに

静止画像を3Dパララックス効果のある動画に変換するオープンソースツールがでたので触ってみます。特徴としては、GPU加速のGLSLシェーダーで高速処理(RTX 3060で8K@50fps)、AI深度推測で奥行情報を生成します。

github.com

開発環境

環境構築

プロジェクトをcloneします

git clone https://github.com/BrokenSource/DepthFlow.git

uv環境を作成します

uv venv --python 3.12
.venv\Scripts\activate

必要なライブラリ等を入れていきます

uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
uv pip install .

実行

以下でgradio版を起動します

depthflow gradio

起動すると以下のようなUIが立ち上がります

以下のような入力画像を入れます(nanobanana作)

実行すると以下のようなDepthの画像が途中に生成されます

これをもとに以下のような動画(ブログ用にGIFにしています)が生成されます

anime-face-detectorを使ってアニメ顔の検出およびランドマーク検出を行う

初めに

アニメ顔(イラスト画像や動画、Live2D)などからランドマーク検出を取得する場合、最新の環境でもanime-face-detector は精度がよく候補に挙がってきます。ただしオリジナルのリポジトリでは、ライブラリ依存などで動かなかったりCPUで動いていたりするので、最新の環境で動かすようにしていきます

以下のforkをして対応をしたものを公開しています

github.com

  • Docker対応(GPU)
  • OpenMMLab 2.0対応

開発環境

環境構築

以下からcloneをします

github.com

次に以下を実行して以下のコマンドを実行することで、ローカルのgraido + GPU版が起動します

docker run --gpus all -p 7860:7860 ghcr.io/ayutaz/anime-face-detector:gpu-cuda12.1 \
    python demo_gradio.py --device cuda:0

実行

Gradio版を実行することで以下のように検出することができます

3podi/audio2chartを使ってギターヒーロー風リズムゲームの譜面を音源から作成する

初めに

audio2chart: End to End Audio Transcription into playable Guitar Hero charts にて以下のような譜面が生成できます。こちらをローカルで動かしてみます

こちらは Moonscraper-Chart-Editorのソフトを使って、譜面データを再生したときの画像です。

開発環境

環境構築

動かすための環境を作っていきます

git clone https://github.com/3podi/audio2chart.git
cd audio2chart

次にライブラリをインストールします

uv pip install -r requirements.txt

初回実行時には以下でモデルをダウンロードします

uv pip install huggingface-hub
huggingface-cli download 3podi/charter-v1.0-40-M-best-acc-nonpad

譜面データの作成

任意の音声ファイルを使って以下のように譜面データを作成します

uv run python generate.py "音声ファイルのパス"

生成したファイルをプレビューをするために、Moonscraper Chart Editor v1.5.12 から動くものをダウンロードします (通常は Win64.exeで問題ないです)

起動することで以下のような画面になります。

上のメニュから File → Loadから生成したファイルをロードします

再生ボタンを押すと以下のように流れます

macでneutts-airを動かす

初めに

開発環境

  • mac M4
  • uv 0.9.x

環境構築

uv venv -p 3.11
source .venv/bin/activate

まずは英語の推論のための espeak-ngを入れます

brew install espeak

ライブラリを入れます

uv pip install -r requirements.txt

次にmacOSの場合は ReadMeに記載があるように一部のファイルを変更します。neutts.py の先頭に以下を入れます

from phonemizer.backend.espeak.wrapper import EspeakWrapper
_ESPEAK_LIBRARY = '/opt/homebrew/Cellar/espeak/1.48.04_1/lib/libespeak.1.1.48.dylib'
EspeakWrapper.set_library(_ESPEAK_LIBRARY)

実行

以下を実行することでベーシックな推論をすることができます

python -m examples.basic_example \
  --input_text "My name is Dave, and um, I'm from London" \
  --ref_audio samples/dave.wav \
  --ref_text samples/dave.txt

WindowsでStreamVoiceAnonを動かしてボイス変換を試す

初めに

最近公開されたリアルタイム音声匿名化/音声変換モデルのStreamVoiceAnonを動かしていきます

github.com

開発環境

環境構築

uv venv .venv
.venv/bin/activate 

ライブラリを入れていきます

uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu126
uv pip install -r requirements.txt
uv pip install triton-windows==3.2.0.post13

モデルをダウンロードします

hf download Plachta/StreamVoiceAnon --local-dir pretrained_checkpoints/

ボイス変換の実行

実行コマンドは以下になります

python evaluations/infer_arvc.py --src_path <path_to_audio> --ref_path <path_to_audio> --out_dir <path_to_output_directory> --delay 2 --compile

サンプルのボイスを使って推論する場合は以下になります。srcの音声をrefの声質に変換します

python evaluations/infer_arvc.py --src_path test_waves/azuma_0.wav --ref_path test_waves/trump_0.wav --out_dir audio_outputs --delay 2 --compile

確認をしたところ日本語も生成ができました

WindowsでTaDiCodecで音声合成を行う

初めに

音声言語モデリングのための拡散ベースの音声トークナイザーのライブラリが出ていたので触っていきます。今回はライブラリ側で提供されている音声合成機能部分を使います

TaDiCodecには以下の二つが提供されています

  1. 自己回帰型TTS
  2. MGM型TTS

精度が比較的高い1を動かしていきます

開発環境

環境構築

uv venv --python 3.10
.\.venv\Scripts\activate

ライブラリをインストールします

uv pip install setuptools wheel psutil packaging ninja numpy hf_xet
uv pip install torch==2.8.0 torchaudio --index-strategy unsafe-best-match --extra-index-url https://download.pytorch.org/whl/cu128
uv pip install transformers==4.42.4 librosa huggingface_hub accelerate scipy json5 resampy tqdm tensorboard einops safetensors omegaconf

uv pip install pyopenjtalk-plus  # Windows向けのwheelが公開されているため、こちらを使用
uv pip install pyworld ruamel.yaml six tensorboardX

Flash Attentionのインストールをインストールします。通常でインストールできれば問題ないですが、試したときにうまくいかなかったので以下のような手順でインストールしました。

curl -L -o flash_attn-2.7.4.post1-cu128-torch2.8.0-cp310-cp310-win_amd64.whl "https://huggingface.co/kim512/flash_attn-2.7.4.post1/resolve/main/flash_attn-2.7.4.post1-cu128-torch2.8.0-cp310-cp310-win_amd64.whl"

# wheelファイル名を標準形式にリネーム(uvの制約のため)
cp flash_attn-2.7.4.post1-cu128-torch2.8.0-cp310-cp310-win_amd64.whl flash_attn-2.7.4.post1-cp310-cp310-win_amd64.whl

# インストール(UV_SKIP_WHEEL_FILENAME_CHECKを設定)
UV_SKIP_WHEEL_FILENAME_CHECK=1 uv pip install flash_attn-2.7.4.post1-cp310-cp310-win_amd64.whl

# wheelファイルをクリーンアップ
rm flash_attn*.whl

音声合成の実行

以下のコードを作成して、実行します

import torch
import soundfile as sf
import sys
import os

# Add parent directory to path (works from anywhere)
script_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(script_dir)
sys.path.insert(0, parent_dir)

from models.tts.llm_tts.inference_llm_tts import TTSInferencePipeline


def main():
    # Get text from command line argument or use default
    if len(sys.argv) > 1:
        text = sys.argv[1]
    else:
        text = "こんにちは、これはテストです。"

    print(f"📝 生成するテキスト: {text}")
    print("🔄 モデルを読み込んでいます...")

    # Setup device
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Load Qwen2.5-3B model (highest quality)
    pipeline = TTSInferencePipeline.from_pretrained(
        tadicodec_path="amphion/TaDiCodec",
        llm_path="amphion/TaDiCodec-TTS-AR-Qwen2.5-3B",
        device=device,
    )

    print("✅ モデル読み込み完了")
    print("🎙️ 音声を生成中...")

    # Set paths relative to script location
    prompt_audio_path = os.path.join(script_dir, "test_audio", "trump_0.wav")
    output_path = os.path.join(script_dir, "output.wav")

    # Generate speech
    audio = pipeline(
        text=text,
        prompt_text="In short, we embarked on a mission to make America great again, for all Americans.",
        prompt_speech_path=prompt_audio_path,
    )

    # Save audio
    sf.write(output_path, audio, 24000)

    print(f"✅ 完了!音声ファイルを保存しました: {output_path}")


if __name__ == "__main__":
    main()

実行することで ARでの音声合成ができます