AivisSpeech-engineの速度計測

これまで、CPU,GPUそれぞれのクラウドサーバでAivisSpeechを動かしてきました。

AivisSpeech-engineをVPSで立ち上げてみた(1)

チャットボットを作っていると、「もう少し感情表現ができないかな?」と思うことがあります。 また、海外の音声合成サービスはどこか”違和感”を感じることがあります。 …

AivisSpeech-engineをGPUクラウドで立ち上げてみた(1)

前回、AivisSpeech-engineをVPS(CPUサーバ)で立ち上げてみましたが、Chatbotには少し応答速度が足りず、GPUクラウドを試してみることにしました。国内にも格安のGPUクラ…

せっかくなので、どのくらいの差が出るのか、簡単に測定してみたいと思います。

測定コード

測定は、GoogleColabからおこないます。

import time
import json
import requests
from pathlib import Path

# 音声合成 API(Nagomi)の設定
# VOICE_API_URL = "<CPU URL>"
VOICE_API_URL = "<GPU URL>"
DEFAULT_SPEAKER_ID = 888753760

def generate_voice_and_save_to_file(text, speaker_id=DEFAULT_SPEAKER_ID, output_file="output.wav"):
    """音声合成 API を呼び出し、音声データをファイルに保存"""
    try:
        # Step 1: audio_query
        print("音声合成クエリ(audio_query)を送信中...")
        query_start_time = time.time()
        query_response = requests.post(
            f"{VOICE_API_URL}/audio_query",
            params={"text": text, "speaker": speaker_id},
        )
        query_end_time = time.time()

        if query_response.status_code != 200:
            print(f"audio_query エラー: {query_response.status_code}, {query_response.text}")
            return

        query_time = query_end_time - query_start_time
        print(f"audio_query 応答時間: {query_time:.2f} 秒")

        # Step 2: synthesis
        print("音声合成(synthesis)を送信中...")
        synthesis_start_time = time.time()
        synthesis_response = requests.post(
            f"{VOICE_API_URL}/synthesis",
            params={"speaker": speaker_id},
            headers={"Content-Type": "application/json", "accept": "audio/wav"},
            data=json.dumps(query_response.json()),
        )
        synthesis_end_time = time.time()

        if synthesis_response.status_code != 200:
            print(f"synthesis エラー: {synthesis_response.status_code}, {synthesis_response.text}")
            return

        synthesis_time = synthesis_end_time - synthesis_start_time
        print(f"synthesis 応答時間: {synthesis_time:.2f} 秒")

        # 音声データをファイルに保存
        print(f"音声をファイルに保存中: {output_file}")
        output_path = Path(output_file)
        with output_path.open("wb") as f:
            f.write(synthesis_response.content)

        print(f"音声ファイルが保存されました: {output_path.resolve()}")

    except Exception as e:
        print(f"エラー: {e}")

# 入力テキストと保存先ファイル名
text_to_synthesize = "こんにちは、いいお天気ですね。今日は何をしていますか?"
output_filename = "synthesized_voice.wav"

# 音声合成を実行してファイルに保存
generate_voice_and_save_to_file(text_to_synthesize, output_file=output_filename)

測定方法

CPUとGPUのそれぞれで3回づつ測定し、平均をとります。
合成する音声は、以下の2種類です。


短文「こんにちは、いいお天気ですね。今日は何をしていますか?」

長文「音声合成エンジンとは、テキストデータを解析し、人間の声に近い音声を生成する技術です。これにより、事前に録音された音声を使用せずに、文章からリアルタイムで音声を作り出すことができます。自然な発音や感情表現の再現が重要で、ニュース読み上げ、ナレーション、音声アシスタント、対話型AIなど幅広い分野で活用されています。最近では、AI技術の進化により、より自然で高品質な音声を高速に生成することが可能になっています。」

結果

1. 短文の応答時間  

処理環境クエリ時間 (audio_query)合成時間 (synthesis)合計応答時間
CPU平均: 0.25秒平均: 4.85秒平均: 5.10秒
GPU平均: 0.60秒平均: 0.99秒平均: 1.59秒

2. 長文の応答時間

処理環境クエリ時間 (audio_query)合成時間 (synthesis)合計応答時間
CPU平均: 0.40秒平均: 29.47秒平均: 29.87秒
GPU平均: 0.69秒平均: 1.96秒平均: 2.65秒
簡単な計測ですが、挨拶文のような比較的短い文章で、3.2倍、長文の場合で、11.3倍の応答速度が得られました。

一方、コストですが、1時間あたり以下のようになっており、約5倍の差があります。

・ CPU  (WebArena Indigo 6vCPU メモリ8GB )       5.35円
・ GPU (runpod 1 x RTX 3080 8vCPU 15 GB RAM).    $0.17 ≒ 25.5円


とはいえ、CPUのサーバでは実行時に、CPU使用率が80%〜100%に達するのに対して、GPUの方は最低価格帯のRTX 3080でもまだ少し余裕がありそうです。

インタラクティブに音声合成したい場合には、いい選択かと思います。