【副業実験記#4】VOICEVOX ENGINEのAPIでテキストから音声を生成してみた話

子育てSEパパのIT×AI×副業ラボ_副業実験記_4 副業実験記

つづき。


はじめに

雑学動画自動生成ツールを自作できないか、検討してみているお話です。

使えそうな技術やツールを調べてみましたが、あまりお金をかけずに自作できそうに感じました。

そこで、初めて使う技術やツールについて、検証してみることにしました。

今回は、テキストから音声を生成できるという「VOICEVOX ENGINE」について、雑学動画自動生成ツールで使えるか検証してみた話です。

検証準備

Pythonのインストール

「Python」で雑学動画自動生成ツールを作るつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

PyCharmのインストール

Pythonでの開発を楽にしてくれる統合開発環境「PyCharm」を使います。

Pythonで雑学動画自動生成ツールを作る際に使うつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

検証用Pythonプロジェクトおよびvenvの作成

検証用「Pythonプロジェクト」を作成します。

PyCharmで簡単に作成できます。

Pythonプロジェクトを作成したら、その中で「venv」(Python仮想環境)を作成しておきます。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

Requestsのインストール

Requests」は、WebサイトやAPIと通信するためのHTTPリクエストをPythonで簡単に使えるようにしてくれるライブラリです。

このライブラリを使用し、APIを実行します。

検証用Pythonプロジェクトでvenvを起動し、「Requests」のパッケージをインストールします。

ターミナルでコマンド実行してインストールする方法やPyCharm上で画面を操作してインストールする方法がありますが、今回は、PyCharm上で画面を操作し、venvに「Requests」パッケージをインストールします。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

Docker Desktopのインストール

「VOICEVOX ENGINE」は、Dockerイメージでも配布されているということで、Dockerイメージ版を使おうと思います。

雑学動画自動生成ツールを作る際に、Dockerを使うつもりだったので良かったです。

手元のパソコンがWindows系OSということと、Dockerを使いやすくしたいため、「Docker Desktop」を使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

VOICEVOX ENGINEの取得

Docker Desktopを起動していることを確認したら、コンソールで以下のコマンドを実行すれば、「VOICEVOX ENGINE」のDockerイメージを取得できます。

CPU版を取得したい場合

docker pull voicevox/voicevox_engine:cpu-latest

GPU版を取得したい場合

docker pull voicevox/voicevox_engine:nvidia-latest

お好みに応じて、CPU版かGPU版が選べます。

私の場合、“GPU版は環境によってはエラーが発生するかもしれない”ということが公式ドキュメントに書いてあったので、一旦、CPU版を取得しました。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

検証してみた

VOICEVOX ENGINEの起動

まずは「VOICEVOX ENGINE」を起動します。

Docker Desktopを起動していることを確認したら、コンソールで以下のコマンドを実行すれば、「VOICEVOX ENGINE」のDockerコンテナが起動します。

CPU版を起動したい場合

docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-latest

GPU版を起動したい場合

docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:nvidia-latest

この場合、コマンドの「’127.0.0.1:50021:50021’」の部分にあるように、API実行時の接続先は、IPアドレスが「127.0.0.1」ポート番号が「50021」になります。

VOICEVOX ENGINE APIを使用したテキスト音声変換の流れ

「VOICEVOX ENGINE」のDockerコンテナ起動時に指定したIPアドレスとポート番号に対して、音声に変換したいテキストを含めてHTTPリクエストを送信すれば、変換後の音声が含まれたHTTPレスポンスが返ってきます。

APIの公式ドキュメントが出ているので、そちらを確認しながら検証していくと良いですね。

調べてみると、テキストから音声に変換する場合、以下のような流れでAPIを使っていくようでした。

  1. 音声合成用クエリを作成する
  2. 作成した音声合成用クエリを編集する(任意)
  3. 音声を合成する

VOICEVOX ENGINE APIを使用したテキスト音声変換の試し

今回は以下のようなシンプルな流れでテキストを音声に変換してみます。

  1. /speakers(/audio_queryで使うスピーカーIDを取得する)
  2. /audio_query(音声合成用クエリを作成する)
  3. /synthesis(音声を合成する)

「/speakers」を使う

「/audio_query」で音声のスピーカー(話す人)IDを指定する必要があるようなので、まずは「/speakers」でスピーカーIDを取得します

「/speakers」を使ったPythonサンプルコード
import requests
import json

# 保存先ファイル名
output_path = "voicevox_speakers.json"

# APIのURL
url = "http://127.0.0.1:50021/speakers"

# VOICEVOX ENGINEのAPIでスピーカー一覧を取得
response = requests.get(url)
response.raise_for_status()
speakers = response.json()

# JSONファイルとして保存
with open(output_path, "w", encoding="utf-8") as f:
    json.dump(speakers, f, ensure_ascii=False, indent=2)

print(f"スピーカー情報を {output_path} に保存しました。")
出力されたJSONファイルの内容(抜粋)
[
  {
    "name": "四国めたん",
    "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
    "styles": [
      {
        "name": "ノーマル",
        "id": 2,
        "type": "talk"
      },
      {
        "name": "あまあま",
        "id": 0,
        "type": "talk"
      },
      {
        "name": "ツンツン",
        "id": 6,
        "type": "talk"
      },
      {
        "name": "セクシー",
        "id": 4,
        "type": "talk"
      },
      {
        "name": "ささやき",
        "id": 36,
        "type": "talk"
      },
      {
        "name": "ヒソヒソ",
        "id": 37,
        "type": "talk"
      }
    ],
    "version": "0.15.7",
    "supported_features": {
      "permitted_synthesis_morphing": "SELF_ONLY"
    }
  },

~ 省略 ~

]

この中の”styles”の下にある”id”が「/audio_query」で指定するスピーカーIDです。

「/audio_query」と「/synthesis」を使う

次に「/audio_query」と「/synthesis」を使って、実際にテキストを音声に変換してみます。

「/audio_query」と「/synthesis」を使ったPythonサンプルコード
import requests

def text_to_voice(text, speaker_id=2, output_path="output.wav"):
    base_url = "http://127.0.0.1:50021"

    # 1. 音声合成用クエリの作成
    query_response = requests.post(
        f"{base_url}/audio_query",
        params={"text": text, "speaker": speaker_id}
    )
    query_response.raise_for_status()
    query = query_response.json()

    # 2. 音声合成の実行
    synthesis_response = requests.post(
        f"{base_url}/synthesis",
        params={"speaker": speaker_id},
        json=query
    )
    synthesis_response.raise_for_status()

    # 3. 音声ファイルとして保存
    with open(output_path, "wb") as f:
        f.write(synthesis_response.content)

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

# 実行例
text_to_voice("こんにちは、今日はいい天気ですね。")

この中の「query = query_response.json()」の後に、以下のような処理を加えると、スピーカーの話の早さや音の高低、抑揚、音量などを調整できるようです。

query["speedScale"] = 1.2  # 話速(1.0 = 標準)
query["pitchScale"] = 0.0  # 音の高さ(半音単位)
query["intonationScale"] = 1.0  # 抑揚の強さ
query["volumeScale"] = 1.0  # 音量
サンプルコードで生成された音声(output.wav)

基本的な機能だけで十分に、雑学動画自動生成ツールで使えると感じました。

おわりに

「VOICEVOX ENGINE」ですが、確かにテキストから音声を生成できることが分かりました。

APIの使い方も、分かればシンプルで扱いやすそうです。

これで、テキストから音声に変換するツールは「VOICEVOX ENGINE」を使えば良いことが分かったので、次の技術やツールの検証に移ろうと思います。

ちなみに、検証用のコードは、すべてChatGPT(GPT-4oモデル)に出力してもらったものを微修正したものです。

「Microsoft Copilot」など、他にも便利なAIアシスタントツールがありますが、既に利用していたChatGPTでも、今のところ十分にアシストしてもらえてます。


今回の記事も、同じように副業に悩んでいる人、手探りで取り組んでいる人にとって、何かの参考になれば嬉しいです。

これからも記録を続けていく予定なので、よければフォローしてもらえると嬉しいです。


つづき。

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