🦜

GoとDockerでつくる音声合成CLI

2022/02/19に公開約3,300字

https://zenn.dev/ddpn08/articles/fb390caa781e54

この記事を読んで試してみようと思いました!

開発元のサイトはこちら

https://voicevox.hiroshiba.jp

ローカルサーバーの立て方

簡単!以下のコマンドで立つ。

docker run -it --rm -p 50021:50021 hiroshiba/voicevox_engine:cpu-ubuntu20.04-0.10.4

macOS環境なら「brew install sox」としておいて以下のシェルスクリプトを作成します。

speak.sh
#!/bin/sh
curl -s -XPOST -G "http://localhost:50021/audio_query?speaker="$1 --data-urlencode text=$2 \
| curl -s -XPOST "http://localhost:50021/synthesis?speaker="$1 \
-H 'accept: audio/wav' -H 'Content-Type: application/json' -d @- \
| play -

使い方は以下のような感じ

sh speak.sh 1 こんにちは

第一引数は後述の話者スタイルに付与された"id"を指定します。

キャラクター(話者)について

curl http://localhost:50021/speakers
[
  {
    "name": "四国めたん",
    "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
    "styles": [
      {
        "id": 2,
        "name": "ノーマル"
      },
      {
        "id": 0,
        "name": "あまあま"
      },
      {
        "id": 6,
        "name": "ツンツン"
      },
      {
        "id": 4,
        "name": "セクシー"
      }
    ],
    "version": "0.10.0"
  },
  {
    "name": "ずんだもん",
    "speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9",
    "styles": [
      {
        "id": 3,
        "name": "ノーマル"
      },
      {
        "id": 1,
        "name": "あまあま"
      },
      {
        "id": 7,
        "name": "ツンツン"
      },
      {
        "id": 5,
        "name": "セクシー"
      }
    ],
    "version": "0.10.0"
  },
  {
    "name": "春日部つむぎ",
    "speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a",
    "styles": [
      {
        "id": 8,
        "name": "ノーマル"
      }
    ],
    "version": "0.10.0"
  },
  {
    "name": "雨晴はう",
    "speaker_uuid": "3474ee95-c274-47f9-aa1a-8322163d96f1",
    "styles": [
      {
        "id": 10,
        "name": "ノーマル"
      }
    ],
    "version": "0.10.0"
  },
  {
    "name": "波音リツ",
    "speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b",
    "styles": [
      {
        "id": 9,
        "name": "ノーマル"
      }
    ],
    "version": "0.10.0"
  }
]

利用について

生成した音声の利用については

「VOICEVOX:<話者名>」とクレジットを記載すれば、商用・非商用で利用可能です。

とのこと。

2フェーズが基本

  1. audio_queryによってテキストを音素片に分解する
  2. synthesisによって音素片群からwavファイルを生成する

1.で得たJSONをそのまま2.でPOSTすることでデフォルト設定での音声合成結果が得られますが、
この間に音素片パラメータをいじることでアクセントやイントネーションを加工できます。

シェルスクリプトに疲れました

なのでGoによるCLIツールを作ってみようと思いました。

ソースコード:

https://github.com/nobonobo/voicevox-cli

インストール

> go install github.com/nobonobo/voicevox-cli@latest

これでGOPATH/bin/voicevox-cliというバイナリがインストールされます。

使い方

Usage of voicevox-cli:
  -endpoint string
    	api endpoint (default "http://localhost:50021")
  -intonation float
    	intonation (default 1)
  -pitch float
    	pitch
  -speaker int
    	speaker
  -speed float
    	speed (default 1)
  -style int
    	style
  -volume float
    	volume (default 1)
> voicevox-cli -speaker=0 -style=0 "こんにちは"
main.go:170: 四国めたん ノーマル 2

「四国めたん」話者の「ノーマル」スタイルで「こんにちは」としゃべります。

その他のオプションの説明:

  • endpoint: サーバーへのendpointを指定します。
  • pitch: 音程を上げ下げします(-0.1~+0.1程度?)。
  • speed: 喋る速度を1.0から変化させます例えば2.0にすると早口になります。
  • intnation: 抑揚の強度を調整します例えば2.0にすると抑揚が大きくなります。

まとめ

ここまで至れり尽くせりな音声合成エンジンに初めて触れた気がします。音声クオリティもかなり高く、2フェーズなのもよく考えられているなぁと思いました。またnvidia-docker環境があれば大量の文章を高速に音声合成することもできそうです。過去に触れたことのあるものは環境づくりが大変だったりOS縛りがあったりで大変でしたが超簡単に環境構築できるような作りなのが親切ですね。

またGoとDockerならほとんどのOS上で動かすことができるので助かりますね!

Discussion

ログインするとコメントできます