OpenAIリリースのWhisperで文字起こし後にテキスト読み上げした話

こんにちは、クルトンです。 今回は、Whisperで文字起こししたものに文字読み上げソフトを使って音声ファイル化してみました! 話者変換やWhisperで翻訳+文字起こしした場合に参考になるかと思います。
2022.10.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さんこんにちは、クルトンです。 今回は耳で内容を把握できると便利だなと思い、Whisperで文字起こししたtxtファイルをVOICEVOXさん(テキスト読み上げソフト)のAPIを利用して、音声をつけてみました。

なお、今回の実行は全てCPUで実行しています。(GPUで実行する場合でも参考にはなります。)

Whisperを使った文字起こしについて気になる方はこちらの記事を参考にしてみてください。

動作環境

% sw_vers
ProductName:	macOS
ProductVersion:	12.6
BuildVersion:	21G115

% docker --version
Docker version 20.10.14, build a224086

% docker-compose --version
docker-compose version 1.29.2, build 5becea4c

環境構築にはDockerとDocker Composeが必要となっています。ご自身の環境で、docker --versiondocker-compose --versionの2つのコマンドが打てる事をご確認ください。

Docker Composeを入れる場合はこちらが参考になります。

また、Docker DesktopをインストールするとDocker Composeが一緒に入ってきますのでそちらで打てるように整えても大丈夫です。(筆者はこちらをインストールしてDocker Composeを打てる状態になっています。)

Docker Compose実行前に

コマンドを実行しても問題無いディレクトリ配下に以下のdocker-compose.ymlファイルを配置してください。

version: "2"
services:
  voicevox_engine:
    image: voicevox/voicevox_engine:cpu-ubuntu20.04-latest
    # image: voicevox/voicevox_engine:nvidia-ubuntu20.04-latest
    ports:
      - "50021:50021"
    tty: true

  whisper:
    build: .
    image: whisper
    tty: true

voicevox_engine

今回、テキスト読み上げにあたってVOICEVOXさんのDocker Imageを使用しています。今回はCPUで実行するため、 image: voicevox/voicevox_engine:cpu-ubuntu20.04-latestを使用していますが、GPUで実行したい場合は、image: voicevox/voicevox_engine:nvidia-ubuntu20.04-latestのコメントアウトを外し、その後1つ上の行をコメントアウトしてください。(実行時のimageを一つになるように調整してください。)

whisper

whisperについては、以下の記事で使用しているDockerファイルを、docker-compose.ymlファイルと同じファイルパス内に配置してください。 (自分でコンテナ作成する場合は、buildタグが必要となりますが、これはDockerファイルのあるパスを明記しています。)

whisperのコンテナを作った事がない場合はdocker-compose buildをしてdocker-compose imagesを実行し、whisperという名前のimageが存在する事を確認してから次に進んでください。

テキストに音声をつける

コンテナ起動

まずdocker-compose up -dでコンテナを起動します。 こちらのdオプションはバックグランドでコンテナ実行をするためのもので、こちらをつけないと同じCLIでそのままコマンドが打てないです。

次にdocker-compose psを打ちます。Stateの欄が2つともUpとなっていれば成功です。

テキスト読み上げ対象のtxtファイルを作成

Whisperで文字起こしをします。既に文字を起こしたものがある、またはテキスト読み上げのみ試したい場合などtxtファイルが準備出来ている場合はこちらは飛ばして大丈夫です。

docker-compose.ymlファイルと同じディレクトリパスに、文字起こししたい音声ファイルを配置します。次にdocker-compose exec whisper /bin/bashコマンドを実行します。 これで対象のファイルをwhisperコマンドを叩くことで文字起こし可能になります。

文字起こしにはwhisperコマンドを叩いてください。(喋っている言語が分かっている場合はlanguageオプションを使うと文字起こしの時間が短縮されます。)

こちらがコマンド例です。

whisper <音声ファイルの名前.拡張子> --language ja

文字起こし完了後に、exitというコマンドを叩いてください。

テキスト読み上げまでのステップ

ここからtxtファイルを使ってテキスト読み上げに入ります。(ファイル名は英文字のみが良いと思われます。)

手順は簡単で2ステップでできます。

  1. APIに渡す用のquery.jsonを作成
  2. query.jsonから音声ファイル作成

なお今回使用したテキストファイルの内容はこちらになります。

こんにちは。これはテスト音声です。
今回はウィスパーを使って、音声の認識をやってみました。
ウィスパーというのはオープンAIがリリースしたものになります。

query作成

コマンド内のファイル名.txtを自身のファイル名に置き換えた後で次のコマンドを実行してください。

curl -s \
-X POST \
"localhost:50021/audio_query?speaker=1"\
--get --data-urlencode text@<ファイル名.txt> \
> query.json

query.jsonの末尾にファイル名.txtの内容がカタカナで表記されていたらquery.jsonの完成です。

query.jsonを使ってAPIを叩いて音声ファイル作成

次のコマンドを叩いてファイルが出来るまでお待ちください。 (wavファイルの名前はお好みで変えても大丈夫です。)

curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "localhost:50021/synthesis?speaker=1" \
    > audio.wav

実際に作ったものはこちらになります。

テキスト読み上げに際してVOICEVOX:ずんだもんを使用させていただきました。

読み上げの話者を変えたい場合はコンテナ起動中にhttp://localhost:50021/speakersでidを確認後、コマンドのlocalhost:50021/synthesis?speaker=1部分の数字を変更してください。

ここまで実行した後にコンテナの動作を停止したい場合は、docker-compose stopコマンドを叩いてください。docker-compose psコマンドでStateの欄が2つともExitとなっていれば停止しています。

おわりに

今回は、Whisperで文字起こししたtxtファイルを使って、テキスト読み上げをしてみました。

今回の内容だと、日本語から日本語への話者変換の形になりますが、Whisperは翻訳してから文字を書き起こすという事も可能なので、英語音声を日本語音声にする事が可能になります。

今回はここまで。

それでは、また!

参考にしたサイト