よみの暇つぶしブログ
話を始める前に読み上げBotとはなんぞや?という話から。 読み上げBotとは、DiscordのサーバーのVCにBotを参加させ、テキストチャンネルに送信されたテキストを読み上げ、VCにいる人がテキストチャンネルを観にいかなくても内容が聞き取れるというもの。 やりたいこと 私の友人が、読み上げBotをMacBookのCPUで動作させていてた。 しかし、MacBookのCPUで合成音声をおこなっていたがために、テキストの送信が行われてから実際に読み上げを行うまでの応答が少し遅かった。 機械学習などでGPGPU技術に触れていた私は、”もしかして、GPUを使えばその問題を解消できるのでは?”と思った。 この予感は見事に当たっていて、なんとGPU版のVOICEVOX-Engineが存在していた!そうとわかれば早速開発開始! https://github.com/VOICEVOX/voicevox_engine |
開発開始
CPUIntel Xeon E3-1271v3 4C/8T (Dockerは4T)
先述した通り、私は機械学習の分野に触れているため、ホストOSにCUDAの環境が整っている。なので、この記事はCUDAのセットアップに関しては割愛する。 Dockerの環境構築 「よし作るぞ!」と言いたいところだが、実は私、Docker未経験。まずはDockerの基礎知識を頭に多少入れてから進めることにした。 理屈では理解できたので、早速公式サイトからインストーラーをダウンロードして、インストールを進めていく。 Docker-Engineの起動にWSL2が必要なので、インストール・アップデートをする。 ここでアップデートを忘れると、Docker Desktop起動時に、「WSLのバージョンが低いぞ!」と怒られることがあるので、注意。 これでDockerの環境構築は終了!ようやくBot本体の開発に移れる。 Alpine LinuxのNodeJS、Ubuntu 20.04のVOICEVOX-Engine(GPU版)の二つのイメージをpullする。 では、それらを使用するために、Docker-compose.ymlを記述していく。
"Dockerfile"コンテナの動作を記述したファイル。パッケージのアップデートなどを行いたいときはここにコマンドを記述することができる。
docker-compose.yml version:"3" services: voicevox-engine: platform:linux/x86_64 container_name:voicevox-engine image: voicevox/voicevox_engine:nvidia-ubuntu20.04-latest restart:always ports: -"50021:50021" tty: true これでDockerのコンテナの設定が完了したので、VOICEVOX-Engineの動作確認とBot本体の開発をしていく。 |
VOICEVOX-Engineの動作確認先ほどの「voicevox.dockerfile」で、VOICEVOX-Engineが使用する50021番ポートを解放するように記述した。 無事アクセスできた。 ここにクエリの書き方が一通り載っているので、わからなくなったらここを見る。 |
DiscordBotの制作これに関しては、過去に一度DiscordBotを開発したことがあったのと、友人がスクリプトを貸してくれたので、そこまで難しくはなかった。 DeveloperPortalからBotの新規作成をして、 プロフィールを記述。 ここからが重要。Botにチャットの読み取りや通話への参加に関する権限を付与する必要がある。 これを忘れると、今回のようなVCを使うBotの場合、コマンドデプロイ時にエラーが発生するので注意。 これが参考にした私の友人のGitHubリポジトリ。 https://github.com/FussyReich/DiscordBot2 このリポジトリの中のDiscordBotの部分だけ拝借する。リポジトリを持ってきただけでは使えないので、少しコーディング。 Discord Botの部分は完成した。今回の開発の目的に、「Dockerの勉強をしたい!」というのがあるので、discord.JSと、モジュール、VOICEVOX_Engineが利用可能な環境をDockerで構築する。 Bot本体はできたので、Dockerfileとdocker-compose.ymlファイルに肉付けをしていく。 node.dockerfile # ベースイメージの読み込み FROM node:alpine RUN npm install WORKDIR /usr/app COPY .\ /usr/app RUN apk update RUN apk add --no-cache ffmpeg CMD [ "npm","start" ] CMD [ "node","index.js" ] EXPOSE 50021 EXPOSE 80 docker-compose.yml version:"3" services: webserver: ports: -"3000:3000" build: context:. dockerfile:node.dockerfile container_name:node image:node:alpine voicevox-engine: platform:linux/x86_64 container_name:voicevox-engine image: voicevox/voicevox_engine:nvidia-ubuntu20.04-latest restart:always ports: -"50021:50021" tty: true これで「Docker-compose build」実行時にモジュールのインストール、「docker-compose up」でDiscordBot(node index.js)の実行するようにできた。 |
実行!!!!!コマンドプロンプトで「docker-compose build」を実行。 ビルド完了後、「docker-compose up」を実行。 期待通り、DiscordBotとVOICEVOX_Engineの同時起動ができた。 このように、VCに参加もできた。喋らせよう!と思ったが、エラー発生。 ステータスコード500。コンテナ間通信はできているが、音声データを返すことができていない。 原因は、GPU版のVOICEVOX-engineなのにGPUを利用できていないからだった。 docker-compose.yml version:"3" services: webserver: ports: -"3000:3000" build: context:. dockerfile:node.dockerfile container_name:node image:node:alpine voicevox-engine: platform:linux/x86_64 container_name:voicevox-engine image: voicevox/voicevox_engine:nvidia-ubuntu20.04-latest restart:always ports: -"50021:50021" tty: true # ここを書き加えた deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] もう一度ビルド&起動! 喋った!!!!! しっかりとCudaを使って合成音声してくれている。 新旧対決 今回作った読み上げBotである「ずんだもんv2」は、CUDAによる爆速レスポンスを武器としている。 なので、同じVCに友人作と私作のBotを2体同時参加させ、同時に同じ149字の文章を送信する。そして、送信から音声の再生が始まった時間を測り比較する。 もう既に日も落ちて、まちの暗いのは当りまえだが、けれどもなんだか、夜のせいばかりでは無く、市全体が、やけに寂しい。のんきなメロスも、だんだん不安になって来た。路で逢った若い衆をつかまえて、何かあったのか、二年まえに此の市に来たときは、夜でも皆が歌をうたって、まちは賑やかであった筈はずだがと質問した『走れメロス』より一部引用 実験の結果なんと… 約10倍もレスポンスの速度に違いがあるではないか!!!! サーバーへの追加はこちらから! 構成図 【クレジット】 VOICEVOX:ずんだもん 東北ずん子プロジェクト 利用規約:https://zunko.jp/guideline.html 本記事、または紹介したBotでは収益を得ていません。 最後まで読んでくれてありがとう! |
2023/11/01