ブルームテクノロジー

テクノロジー

3つの音声合成サービスをPythonで試して結果を比較してみた

3つの音声合成サービスをPythonで試して結果を比較してみた

音声合成とは

人工的に会話などの音声を生成する技術です。
中でも文章から音声を生成する技術をTTS(Text-To-Speech)と呼びます。

今回は「OpenAI Text to speech」「AWSのAmazon Polly」「VOICEVOX」を試してみました。
これらはどれもTTSを行うものです。

また検証にはGoogle Colaboratoryを使用しております。

OpenAI Text to speech

Text to speechはOpenAI社が開発した音声合成サービスです。
OpenAIのAPIを用いて使用できます。

正式名称はText to speechだと思われますが、区別をつけるためにこの記事ではOpenAI Text to speechと記載しております。

検証コード

!pip install openai==1.8.0
import os
os.environ['OPENAI_API_KEY'] = 'OpenAIのAPIキー'
from IPython.display import Audio
from openai import OpenAI

client = OpenAI()
mp3_file_path = '/content/openai_bloomee.mp3'

# 音声合成実行
# modelはtts-1とtts-1-hdを指定することができ、tts-1-hdのほうが精度がいいが遅いという特徴があります
# 話者は alloy, echo, fable, onyx, nova, shimmerが使えます
response = client.audio.speech.create(
    model='tts-1-hd',
    voice='alloy',
    input='吾輩は猫である。名前はまだない。'
)

# ファイルとして保存し音声をColab上で流す
response.stream_to_file(mp3_file_path)
Audio(mp3_file_path, autoplay=True)

結果

生成時間:2.6秒

日本語が得意な外国の方が話しているような音声になってしまいました。
さらに「わがはい」ではなく「ごはい」になってしまいました。

またコードの変更はせず上記のコードを何度も実行していると、極稀に英語の音声が生成されてしまうこともありました。

Amazon Polly

Amazon PollyはAWSの音声合成サービスです。
APIやWebブラウザ上から使用できます。

検証コード

!pip install boto3==1.34.22
aws_access_key_id = 'Pollyの権限があるIAMユーザーのアクセスキー'
aws_secret_access_key = 'Pollyの権限があるIAMユーザーのシークレットキー'
region_name = 'ap-northeast-1'
import boto3
from IPython.display import Audio

# 認証情報等を設定
session = boto3.Session(
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    region_name=region_name
)
client = session.client('polly')
mp3_file_path = '/content/aws_bloomee.mp3'

# 音声合成実行
# Engineは standard, neural, long-formが使えます
# standardよりもneuralのほうが精度がいいですが、料金が高いという特徴があります
# long-formは長文でも流暢な言葉を話せますが、英語(米国)用です
# neuralで使用できる日本語話者は Takumi, Kazuha, Tomokoです
response = client.synthesize_speech(
    Engine='neural',
    OutputFormat='mp3',
    Text='吾輩は猫である。名前はまだない。',
    VoiceId='Tomoko',
)

# ファイルとして保存し音声をColab上で流す
with open(mp3_file_path, 'wb') as f:
    f.write(response['AudioStream'].read())
Audio(mp3_file_path, autoplay=True)

結果

生成時間:1.5秒

日本人っぽくはあります。
ただ、neural(精度の良い方)を用いても機械音声だと一発でわかります。

VOICEVOX

オープンソースとして提供されています。

Windows等で使用できるフリーソフトとしても提供されておりますが、
今回はPythonから実行するため、音声合成のコア部分であるVOICEVOXコアのみを使用します。

クレジット表記

VOICEVOX:四国めたん

検証コード

# 必要ライブラリ等インストール
version='0.14.5'
!pip install https://github.com/VOICEVOX/voicevox_core/releases/download/$version/voicevox_core-$version+cpu-cp38-abi3-linux_x86_64.whl
!curl -sSfL https://github.com/VOICEVOX/voicevox_core/releases/latest/download/download.sh | bash -s
%cd voicevox_core/
from pathlib import Path

from IPython.display import Audio
from voicevox_core import VoicevoxCore

# 話者のidを指定( https://github.com/VOICEVOX/voicevox_fat_resource/blob/main/core/model/README.md を参照)
speaker_id = 0

wave_file_path = '/content/voicevox_bloomee.mp3'

# 日本語の辞書が存在する場所を指定しクラス読み込み
core = VoicevoxCore(open_jtalk_dict_dir=Path('open_jtalk_dic_utf_8-1.11'))

# 対象のidのモデルを読み込む
core.load_model(speaker_id)

# 音声合成実行
wave_bytes = core.tts('吾輩は猫である。名前はまだない。', speaker_id)

# ファイルとして保存し音声をColab上で流す
with open(wave_file_path, "wb") as f:
    f.write(wave_bytes)
Audio(wave_file_path, autoplay=True)

結果

生成時間:5.1秒

上記音声は比較的自然な言葉遣いのように聞こえますが、
他の文章なども試してみた結果、イントネーションがおかしいものもありました。

おまけ

英語の文章でも試してみました。

I have no idea where I was born.
(訳)どこで生れたか頓と見当がつかぬ。

OpenAI Text to speech

Amazon Polly

Amazon Pollyは日本語と英語で話者が分けられているので両方生成しました(英語話者:Ruth)

ちなみに、英語話者(Ruth)で日本語の文章を読ませたときの結果はこちらです。

VOICEVOX

まとめ

OpenAI Text to speechAmazon PollyVOICEVOX
日本語◯(※)
英語 ◯(※)
日本語生成秒数2.6秒1.5秒5.1秒
※ただしAmazon Pollyは日本語・英語で話者を切り替える必要がある

今回試した3つのサービスに限って言えば、機械音声であることがわかってしまうという結果になってしまいました。

今回試したサービスの選定基準は、「新たにアカウントを作る必要がなく実装に手間取らない」という理由でしたので、他のサービスでもっと流暢に話すものもあるかもしれません。

ちなみに英語の音声についてはネイティブの方が聞くと聞き分けがつかないレベルまで来ているのでしょうか。
もしそうなのであれば日本語でも同じクオリティになるのは時間の問題かもしれませんね。