VoiceCoreの基本的な使い方 – 感情豊かなAIエージェント向け音声合成モデル

AI

1.VoiceCoreの基本的な使い方 – 感情豊かなAIエージェント向け音声合成モデルまとめ

・商用利用可能なライセンスで無料で感情豊かな日本語音声の発生が可能なAIエージェント用モデルVoiceCoreを公開
・Colab用のサンプルスクリプトや微調整用スクリプトも公開しているので独自音声の追加を体験する事も可能
・AIに人間に音声で対話する能力を与える事で新規の需要の掘り起こしができるのではないかという思いから無料公開

2.VoiceCoreとは?

VoiceCoreはAIが感情を込めた自然な日本語を発声できるようにする商用利用可能なVoice AI Agentモデルです。従来のTTS(Text to Speech:音声合成)ソフトウェアと異なる点は、文章を正確に発声する事は目的ではなく、AIが人間の声を借りて音声対話するためのVoice AIエージェント用モデルとして設計されており、笑い声などの非言語音声や感情表現が可能な事が特徴です。

VoiceCoreが従来のTTSと一線を画すのは、「あはは」「うふふ」「えへへ」「わはは」といった日本語特有の多様な笑い声表現や、感嘆符、息づかいなど、人間の自然な発話に含まれる感情表現を再現できる点です。AIエージェントが文脈を意識した人間らしい感情を込めた発話を実現することで、ユーザーとのより深いコミュニケーションが可能になる事を想定しています

3.ベンチマーク性能

VoiceCoreは商用モデル級の高品質を実現していることが検証されています。

東京大学開発の評価モデル(UTMOS)と業界標準指標(NISQA)で、大手の最新商用モデルと肩を並べる性能を実証しており、以下のような評価結果を得ています:

モデル UTMOS平均 UTMOS標準偏差 NISQA平均 特徴
VoiceCore 2.83 0.46 4.29 全体的に品質のバラツキが少ない
ElevenLabs V3 2.96 0.67 4.19 高品質だが文章によってブレがある
Gemini 2.5 Pro tts preview 2.81 0.58 4.52 技術的に最もクリーンで安定

3Bパラメータの軽量設計により、消費者向けGPU上でリアルタイム動作可。高額なAPIコストから解放され、無制限の音声生成が可能です。

4.ライセンスと注意事項

VoiceCoreは商用可能ですが、モデルライセンスと音声データのライセンスをわける実験的な試みをしています。人間の成果物/著作物をAIで無断で学習する事が問題視される事が増えてきていますが、仮に法律論で問題ない判断になったとしても、音声領域で活動されている方や音声素材を公開してくださってる方達が避けたいと思うような使い方をする人が増えたら音声領域の活動は衰退するし、音声素材の公開をしてくれる人もいなくなってしまうのではないかという懸念に対するWebbigdataの思想を反映しています。

モデルライセンス

モデルライセンス: 解釈に応じて、LLAMA 3.2 COMMUNITY LICENSEまたはApache License, Version 2.0のいずれかを選択できます。これは、ベースモデルとなったOrpheusが独自のカスタム音声トークンを出力し、Llama3.2の出力ではなく、変形的/派生的な著作物として解釈できるためです。念の為ですがどちらも商用利用を許諾しているライセンスです。

音声データのライセンス

VoiceCoreにはデフォルトで複数の音声が同梱されていますが、それぞれ異なるライセンス条件があります。全てのディフォルト音声とそのライセンスは詳細はhuggingfaceのモデル公開ページを御覧ください。

女性の声はプレビュー版の位置づけです。現在は高音域でノイズが乗ってしまう傾向があります。

声のタイプ 商用利用 使用不可コンテンツ クレジット表記 提供元
amitaro (明るい女の子) ⭕ 可能 (要事後報告) ❌ エロ・グロ ❌ 政治・宗教❌ ヘイト ✅ 必須 「あみたろの声素材工房」 あみたろの声素材工房
matsukaze (さわやかな男性) ⭕ 可能 ✅ 必須 「松風」 松風
naraku (落ち着いた女性) ⭕ 可能 (商用は要連絡) ❌ 反社・政治・宗教
❌ 品位を損なう行為
個人利用:❌ 不要
商用利用:✅ 必須「極楽唯」
VTuber 奈落ゆい
shiguu (大人びた少年) ⭕ 可能 (商用は要連絡) ❌ 品位を損なう行為
❌ 政治・宗教
✅ 必須 「刻鳴時雨(CV:丸ころ)」 バーチャルシンガー「刻鳴時雨
sayoko (一般81歳女性) ⭕ 可能 ❌ エロ・グロ ✅ 必須 「Fusic サヨ子音声コーパス」 bandad/sayoko-tts-corpus
nekketsu (熱血ヒロイン) ⭕ 可能 (商用は要連絡) ❌ 悪用(詐欺的広告、フェイクニュース/動画、差別・中傷など) ✅ 必須 「紅葉美兎及びAI生成音声である事」を明記 紅葉美兎
dahara1 (一般男性) ⭕ 可能 ✅ 任意 apache2 Webbigdata

体験・活用方法

オンライン体験デモ

まずはVoiceCoreの音声品質を体験してみたい方は、無料のオンライン体験デモページをご利用ください:

🌐 音声合成オンライン体験デモ

Colabでの無料体験

Google Colaboratoryを使用して、無料でVoiceCoreの音声生成やファインチューニングを試すことができます:

📘 GitHub – VoiceCore Colabサンプル

商用サポート

カスタマイズや本格的な商用利用をご検討の方は、専門サポートもご利用いただけます:

💼 商用サポート・お問い合わせ

基本的なセットアップ

Llama.cppを使う場合の環境準備

Homebrewのインストール(まだの場合)、必要なパッケージのインストール、Pythonライブラリのインストールを行います:

# Homebrewのインストール(まだの場合)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 必要なパッケージのインストール
brew install cmake
brew install python@3.11

# Pythonライブラリのインストール
pip3 install torch snac numpy httpx pyaudio scipy

llama.cppのセットアップ

# llama.cppのクローン
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# ビルド(Macの場合)
make

# Metal(Mac GPU)を使用する場合
make LLAMA_METAL=1

サーバーの起動

# 基本的な起動方法
./llama-server \
-m path/to/VoiceCore-BF16.gguf \
--prio 3 \
-c 2048 \
-e \
-n -2 \
-fa \
-ngl 99 \
-v \
--port 8080 \
--host 0.0.0.0 \
--no-webui

サンプルスクリプト

以下は、VoiceCoreを使用した基本的な音声生成のサンプルコードです:

import asyncio
import httpx
import json
import re
import torch
from snac import SNAC
import scipy.io.wavfile as wavfile
import numpy as np

async def generate_voice(prompt, output_file="output.wav"):
    """シンプルな音声生成関数"""
    # SNACモデルの読み込み
    print("SNACモデルを読み込んでいます...")
    snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz")
    snac_model.to("cpu")
    
    # サーバーにリクエスト送信
    payload = {
        "prompt": prompt,
        "temperature": 0.8,
        "top_p": 0.95,
        "n_predict": 2048,
        "repeat_penalty": 1.1,
        "repeat_last_n": 70
    }
    
    collected_tokens = []
    async with httpx.AsyncClient(timeout=None) as client:
        response = await client.post(
            "http://localhost:8080/completion",
            json=payload,
            headers={"Accept": "application/x-ndjson"}
        )
        
        # トークンの収集
        async for line in response.aiter_text():
            if line.strip():
                try:
                    data = json.loads(line)
                    if "content" in data:
                        matches = re.findall(r'<custom_token_(\d+)>', data["content"])
                        for match in matches:
                            token_id = 128256 + int(match)
                            collected_tokens.append(token_id)
                except:
                    pass
    
    # 音声の生成
    if collected_tokens:
        # 7の倍数に調整
        code_length = (len(collected_tokens) // 7) * 7
        tokens = collected_tokens[:code_length]
        
        # コードの再分配
        codes = redistribute_codes(tokens)
        
        # 音声デコード
        with torch.inference_mode():
            audio_hat = snac_model.decode(codes)
            audio_np = audio_hat.detach().squeeze().cpu().numpy()
            
        # WAVファイルとして保存
        wavfile.write(output_file, 24000, audio_np)
        print(f"音声を {output_file} に保存しました。")

def redistribute_codes(tokens):
    """トークンをSNACコード形式に変換"""
    code_list = [t - 128266 for t in tokens]
    layer_1, layer_2, layer_3 = [], [], []
    
    for i in range(len(code_list) // 7):
        layer_1.append(code_list[7*i])
        layer_2.append(code_list[7*i+1]-4096)
        layer_3.append(code_list[7*i+2]-(2*4096))
        layer_3.append(code_list[7*i+3]-(3*4096))
        layer_2.append(code_list[7*i+4]-(4*4096))
        layer_3.append(code_list[7*i+5]-(5*4096))
        layer_3.append(code_list[7*i+6]-(6*4096))
    
    return [
        torch.tensor(layer_1).unsqueeze(0),
        torch.tensor(layer_2).unsqueeze(0),
        torch.tensor(layer_3).unsqueeze(0)
    ]

# 使用例
async def main():
    # 松風さんの声で挨拶
    prompt = "<custom_token_3><|begin_of_text|>matsukaze_male[neutral]: こんにちは!よろしくお願いします!<|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
    await generate_voice(prompt, "greeting.wav")

if __name__ == "__main__":
    asyncio.run(main())

声の指定方法

VoiceCoreでは、シンプルで自然な方式で声と感情を指定できます:

voicename_gender[emotion]:<半角スペース><テキスト>

例:

matsukaze_male[neutral]: こんにちは!元気ですか?
amitaro_female[happy]: わあ、とても嬉しいです!

emotionは基本はneutralを指定します。感情は文章から自動で読み取られます。明示的に感情を指定することもできますが、多くの場合は文章の内容から適切な感情表現が自動的に適用されます。

設計思想

他の英語圏対話系TTSでよく見られる <laugh> 等のタグで指定する方式は今回のVersionでは採用しませんでした。日本語には「あはは」「うふふ」「えへへ」「わはは」のような多様な非言語表現が存在します。タグ方式は英語では十分対応可能かもしれませんが、日本語の豊かな表現力には適さないと判断しました。

さらに重要なのは、非言語表現を実現することは必ずしも文章で書かれた表現を「厳密に発音する」ことに繋がらないケースがあることです。これがVoiceCoreの冒頭でお伝えした「文章を正確に発声する事は目的ではない」という思想に繋がっています。

例えば、デフォルトボイスによっては「あはは」をかなり豪快な笑い声として表現する場合もありますが、これを細かく制御しようとするより「非言語音声は人によって読み上げ方が違うのは当然であり、これは本モデルのAIエージェントとしての特徴」と考えた方が自然と感じたのです。AIを使った合成音声で人間の声を代替するのではなく「AIが人間の声を借りて自然な音声対話を行うためのエージェント(代理人)」という設計思想で、文脈に応じた感情的な表現の実現を優先しているのです。

注意事項

入力テキストについて

マークダウンやHTMLなど、発音できない記号がたくさん含まれる文章は誤動作の原因となるので削除を推奨します。

例えば、以下のような記号はなるべく事前に除去してください:

  • マークダウン記法:**太字**# 見出し[リンク](URL)
  • HTML タグ:<div><span><p>
  • プログラムコード:{}[];

英語はそこそこ読めますが、カタカナに変換した方が確実です。

量子化モデルについて

VoiceCoreは量子化に敏感なモデルです。ベースモデルであるorpheus-3bはQ4_K-f16以下の量子化レベルで音声ファイルの作成に失敗するケースがある事がわかっています。

高品質な音声生成が必要な場合は、BF16版の使用を推奨します。

まとめ

VoiceCoreは、感情豊かな音声表現が可能な次世代のVoice AIエージェント向けの音声合成モデルです。商用利用可能でありながら、大手商用モデルに匹敵する品質を3Bという軽量モデルで実現しています。

自然な文章をそのまま入力するだけで、AIが文脈を理解して適切な感情表現を行うシンプルな設計により、人間がAIと音声を使って自然に対話するための基盤となりえます。

人間の仕事を奪うのではなく、新しい仕事の創出。

まだ具体的な計画があるわけではありませんが、例えば、一人暮らしのおじいさんやおばあさんと音声で対話できるAI/ロボットが安価で実現できれば、孤独感が和らぐかもしれませんし、その結果、少しでも前向きな気持ちになる効果なども出てくるかもしれません。

コストの観点から人間が毎日高齢者の話し相手をするのは難しいですが、AI/ロボットであれば非常に低コストでこれが実現できる可能性があります。しかし、これを実現するためには少なくとも音声基盤は安価軽量の必要があるでしょう。社会全体に一石を投じてみたい気持ちもあり、今回、完全無料でモデル公開に踏み切った経緯です。

ぜひ、あなたのプロジェクトでVoiceCoreを試してみてください!


関連リンク

タイトルとURLをコピーしました