【OpenAIアップデート】音声サービスの処理時間を調べてみた【Whisper・TTS・GPT3.5-Turbo-1106】
はじめに
新規事業部 生成AIチームの山本です。
今日(2023/11/7)の朝、OpenAI社のDevDayが開催され、様々な発表がありました。多くの革新的な新サービスの一つに、音声(Text-to-Speech、以下 TTS)のAPIが公開されるという発表がありました。
最近、音声でQAシステムを組むことを検討していたところに、ちょうどTTSも加わったため、音声での対話システムとして、どの程度の時間がかかりそうか調べてみました。
今回は、最低限の構成として、以下を調べました。
- 入力:Whisper
- 回答:GPT3.5-turbo-1106(※)
- 出力:TTS
※ GPT4-Turboを利用したかったのですが、レート制限にかかり利用できませんでした(後述)
Whisper
以前からもAPIで利用することができた、音声を文字にしてくれるモデルです。
https://platform.openai.com/docs/guides/speech-to-text/quickstart
入力として使用する、日本語のサンプル音声を用意し、その音声の長さと処理にかかった時間を調べました。
結果
横軸に音声の長さを、縦軸に処理時間をとって、プロットした図です。
入力音声が長いほど、処理時間も長くなっている様子がわかります。散らばりが少し大きいですが、そもそも処理時間が短いので、少しの影響で大きく見えているように思えます。
直線で近似すると、以下のように表せそうです。
- 処理時間 = 入力音声時間 * 0.07 + 0.78 [秒]
TTS(Text-to-Speech)
今回新しく発表された、文字を音声にしてくれる(Text-to-Speech)モデルです。
https://platform.openai.com/docs/guides/text-to-speech
実行した処理(測定方法)
テキストを音声にする処理を実行し、喋らせる音声の量を増やしながら、処理時間をそれぞれで計測しました。入力テキストは、日本語のものと英語のものを利用しました。
使用コードはこちらです。
クリックで開きます
```python
import time
from pathlib import Path
from mutagen.mp3 import MP3
from openai import OpenAI
client = OpenAI()
# speech_file_path = Path(__file__).parent / f"speech.mp3"
# text = "Today is a wonderful day to build something people love!"
# response = client.audio.speech.create(
# model="tts-1",
# voice="alloy",
# input=text,
# )
# response.stream_to_file(speech_file_path)
n_retry = 5
for i_length in range(1, 21):
for i_retry in range(n_retry):
speech_file_path = (
Path(__file__).parent / f"speech_{i_length:02d}_{i_retry:01d}_rev.mp3"
)
text = "Today is a wonderful day to build something people love!" * i_length
# text = "こんにちは。こちらはクラスメソッド株式会社です" * i_length
t0 = time.time()
response = client.audio.speech.create(
model="tts-1",
voice="alloy",
input=text,
)
response.stream_to_file(speech_file_path)
t1 = time.time()
# MP3オブジェクトを読み込む
audio = MP3(speech_file_path)
# 音声の長さ(秒)を取得
audio_length = audio.info.length
print(i_length, audio_length, t1 - t0)
```
結果
横軸に音声の長さを、縦軸に処理時間をとって、英語・日本語のテキストの両方のケースをプロットした図です。
散らばりが少し大きいですが、どちらの言語のテキストでも、同じ直線で近似できそうな様子です。
よって、処理時間は以下のように表せそうです。
- 処理時間 = 0.164 * 出力音声時間 + 0.66 [秒]
補足
- 同じテキストを入力しても、出力される音声のテキストは、リクエストごとに微妙に異なりまり、音声の長さや話し方が微妙に違いました。(通常の使い方をしている分には、全く気にならないレベルです)
- client.audio.speech.createのパラメータにspeedという項目があります。この値は音声の再生スピードの率を表しており、1よりも大きくすると早く再生された(倍速再生のような)音声が出力され、1よりも小さくすると遅く再生された(スロー再生のような)音声が出力されます。この値を大きくしたほうが出力される音声が短くなり、処理時間も短くなり、この値を小さくしたほうが出力される音声が長くなり、処理時間も長くなりました。厳密な計測はしていませんが、おそらく上のグラフと同様の結果のようでした。
streaming
以下のページに掲載されている、ストリーミングでの再生も試しました。
https://platform.openai.com/docs/guides/text-to-speech/streaming-real-time-audio
非ストリーミングよりも、劇的に早くなることを期待していましたが、音声再生が開始されるまでの時間は、上記の処理時間とほとんど変わりませんでした。
GPT4-Turbo(レート制限のため、GPT3.5-turbo-1106で計測)
今回新しく発表された、GPTの新しいモデルです。
ですが、下のRate Limitのページにかかれている通り、100リクエスト/日と設定されており(2023/11/07現在)、社内で早速使われてしまったため(早い!)、自分は試すことができませんでした。
https://platform.openai.com/account/limits
※ 追記:10,000 RPD利用できるようになっていました(2023/11/09現在)
実行した処理(測定方法)
GPT4-Turboは後日計測するとして、この記事ではGPT3.5-turbo-1106の処理時間を計測します。以前の記事で、GPT3.5-turbo-0613の処理時間は試しましたので、同じ方法で計測します。
OpenAIのChatCompletion APIの処理時間は出力トークン数に比例してそうだった | DevelopersIO
※ 前回の結果、処理時間は出力トークンと線形(ほぼ比例)の関係にありそうで、Gpt3.5-turbo-0613は100出力トークンあたり4秒の処理時間がかかる、という結果でした。
結果
出力トークン数と、処理時間の関係は下図のとおりでした。
両者には線形の関係がある様子が見てとれます(GPT3.5-trubo-0613と同様)。
よって、処理時間は以下のように表せそうです。
- 処理時間 = 出力トークン数 * 0.0062 + 0.35 [秒]
補足
GPT3.5-trubo-1106の出力スピードが、GPT3.5-trubo-0613よりも格段に早いという結果でした。具体的には、GPT3.5-trubo-0613では、100トークンあたり4秒でしたが、GPT3.5-trubo-1106では、100トークンあたり0.6秒でした。(今回、GPT3.5-turbo-0613を改めて測定し直しましたが、処理時間は以前の記事とほぼ同じでした)。
全体
上記3つのサービスを繋いだ場合を考えます。
例えば、以下のように、ちょっと長めの質問・回答をしたケースを想定します。
- 入力音声:10秒程度
- 回答生成:30単語程度(≒ 30トークン)
- 出力音声:10秒程度
この場合、それぞれの処理時間は、以下のとおりです。
- Whisper:1.48秒
- GPT3.5-turbo-1106:0.54秒
- TTS:2.30秒
合計は4.30秒です。
ユーザが喋り終わった後から回答の音声が流れ始めるまでに、このくらいの時間がかかるので、体験的には悪くないレベルのように思われます。
(実際には、オーバーヘッドなどがあるので、もう少し長くなると思われます)
まとめ
OpenAI社の新しいサービスのうち、音声によるQAシステムを作成する際に使うと思われる、3つのAPI(Whisper・Gpt3.5-turbo・TTS)について処理時間を計測しました。
補足
実行環境
以下のとおりでした。
- 測定時刻:11/07 11:00~15:00
- OS:Windows 10
- 機器:Surface Laptop 4
- ソフト:VSCode上で実行
- 言語:Python 3.10.0
- OpenAIモジュール:1.1.1
※ 処理時間は状況によって変わる可能性が十分考えられますので、ご注意ください