--- Title: Discordテキストチャットをボイスチャットで読み上げるbotを作るまで Author: longislong Web: 'https://mimemo.io/m/M2rKBGzPe9lD0Em' --- 何をしたかの自分用メモ書きなのでここだけ読んで作り上げるのは多分できないです。 説明もほとんどしていないので参考Webサイト見ながらがおすすめです。 # 今回の挑戦者 **クアッカ** - 趣味はTwitter:https://twitter.com/quakka_aa - C言語検定1級持ってるけど随分触ってない - 何となくこの辺を触ってどうにかなってきた → C++, C#, Perl, PHP, COBOL, VB.NET, VBA(OfficeMacro), JavaScript, ActionScript, Winバッチファイル, Linuxシェルスクリプト - Pythonは全く触ったことがないし導入とかも読んだことがないけどインタプリタ言語だし勝てるだろうと何故か自信満々 **Cube** - 面白そうなので現場に来たっぽい。居合わせたので記載 - 多分C言語とJavaがわかっててその他はチョットワカル - Pythonのことをちょっと知ってた - 作業中の話し相手として非常に優秀で、システム開発あるあるの話とかどういうエラーみたいな話は大体わかってくれる - これをやったらどうなるんだろうみたいなデバッグを手伝ってくれた - すげー長いコピペが欲しいって言ったらすぐ持ってきた **サーモン君** - 今回作られたbot - アイコンがカニ - 「やったるでエビ太郎」サーバーで産まれたモンスター - ボイスチャンネル「イカ」と「タコ」で動作確認をされた - バグって暴走した時に笑いを誘う ![salmon](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/ed518f1c-1238-4a54-a31f-234b31f939bf.png) # 参考webサイト **Discordのチャットを読み上げるbotの作成** https://qiita.com/9610r/items/d04bd91d373d31d9c3f3 # 実装環境 2020年8月10日から作業開始 * Windows 7 * Python 3.8.5 * discord.py 1.4.1 # Pythonのインストール **Python3のインストール** https://www.python.jp/install/windows/install_py3.html インストール時の「Add Python 3.* to PATH」はチェックをいれる。 # DiscordBotの登録・必要情報取得 これを読みながら進んで問題なかった **Discord bot作成チュートリアル** https://ikayome.hateblo.jp/entry/2019/07/03/Discord_bot%E4%BD%9C%E6%88%90%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB 1. デベロッパー画面を開く 1. アプリケーションを登録 1. Bot登録をする 1. Botとして動かすためのTokenを取得 1. サーバに追加するためのURLを取得 1. 試運転をするためのサーバにBotを追加 1. HelloWorld的なPythonコードを書いて動くか試す # Open Jtalkの導入 **Windowsで音声合成Open JTalk** https://qiita.com/mkgask/items/0bf9c26dc96e7b0b45ac 知識が無いと大分厳しい戦いになります。 **詰みポイント1**:C++をソースコードからビルドするためにビルド環境が必要で、多分一番手軽なのはMicrosoft Visual Studioです。 無料でCommunityエディションがダウンロードできるのでダウンロードしてインストール。 何を作りたいんですか?みたいな画面になったら「C++によるデスクトップ開発」を選択する。 **詰みポイント2**:拡張子tar.gzを解凍できるソフトウェアが必要、私は7zipを使いました。 https://sevenzip.osdn.jp/ tar.gzというのは - tar:複数のファイルを圧縮せずに一つのファイルにまとめる - gz:ファイルを圧縮する という2つの処理が行われているという意味になります。 ◆7zipを使ったtar.gz解凍方法 1. tar.gzファイルを右クリック→「7-Zip」→「ここに展開」で圧縮が解除されてtarファイルがその場に生成されます。 1. tarファイルを右クリック→「7-Zip」→「-ファイル名-\に解凍」でフォルダが生成されてその中にファイルが展開されます。 ## HTSエンジンをDL 音声の合成に必要みたい。 私が使ったのは **hts_engine_API-1.10** 名前に「API」が入っているものをDL 先程の手順で解凍しておく ## Open JTalkをDL 日本語喋るのに多分必要、付随するものも一緒にダウンロードする 私が使ったのは **open_jtalk-1.11** **open_jtalk_dic_shift_jis-1.11** **hts_voice_nitech_jp_atr503_m001-1.05** 解凍しておく 辞書ファイルはutf8を使いたい気持ちでいっぱいなのですが、Windowsのコマンドプロンプトの基本文字コードがshift-jisにオリジナル要素の入ったcp932でutf8とハチャメチャに相性が悪いらしくshift-jisを泣く泣く選択しています。 ## HTSエンジンのビルド コマンドプロンプトを用いてmakeを通してビルドします。 **ここで詰んだらもうやめておいたほうがいいです** 作業フォルダのパスに2バイト以上の文字を含んでいるとエラーとなる可能性があるため注意 VisualStudioのインストールフォルダを探して「vcvarsall.bat」のパスを探しておく。 コマンドプロンプトでファイル解凍先にcdをしてから call "【vcvarsall.batのフルパス】" x64 を蹴って nmakeコマンドでビルド実行。 Cドライブ直下に「hts_engine_API」ディレクトリができて「include」ディレクトリもあって「HTS_engine.h」が生成されていたら勝ち。 ## Open JTalkのビルド HTSエンジンと同じようにファイル解凍先にcdしてからnmakeを蹴ると色々始まります。 割と素直じゃないっぽくて、Warningとか山程出てきてびっくりします。 最終的にfatal errorが出て止まったのですが必要なものはここまでで生成されました。 「C:/open_jtalk/bin/open_jtalk.exe」があったら勝ち。 ## Open Jtalkの準備 **辞書ファイルの準備** 解凍したopen_jtalk_dic_shift_jis-1.11のディレクトリ名を「dic」に変更し、「C:/open_jtalk/bin」にコピー **音響モデルファイルの準備** 解凍したhts_voice_nitech_jp_atr503_m001-1.05の中から「nitech_jp_atr503_m001.htsvoice」を探してファイル単体を「C:/open_jtalk/bin」にコピー **音声合成の動作テスト** 「C:/open_jtalk/bin」にinput.txtでファイルを作成。shift-jisでこんにちは的なことを記入しておく。 コマンドプロンプトで「C:/open_jtalk/bin」にcdしてから以下のコマンドの発行をする 「open_jtalk.exe -m nitech_jp_atr503_m001.htsvoice -x dic -ow output.wav input.txt」 成功すると「output.wav」が生成されていてinput.txtの入力内容を喋っていることを確認できる。声が渋すぎて笑ってしまう。 ## 女性の声に変更 デフォルトの声だと渋すぎて笑ってしまうので変えました。 でも全て終わった後のオマケ要素だと思いますし、ここまでは説明しません。 参考URLに書いてあるとおりにダウンロードとコマンド書けたらいけます。 -- Open_Jtalk関連の仕込みはここまで。 # ffmpegの導入 **windowsにffmpegをインストールする** https://web.plus-idea.net/2015/11/windows-ffmpeg/ ffmpegとは何か:動画や音声などのメディアファイルをコンバートしたりアレコレする時にめちゃくちゃ強いソフトウェア。 **この項目では「環境変数にPATHを通す」必要があります!** ダウンロードの段階でまた「ソースコードからビルドしてくれよな」っていう空気が漂ってて冷や汗が出ますが、ちゃんとWindows用のビルドがあるので安心してください。Windowsっぽいアイコンのリンクから行けると思う。 その後は「Static」バージョンであること、環境に合わせた32bitと64bit、この2点をよく確認してダウンロード。 ダウンロード適当にしてから確認したら合ってたのでラッキー気分でした。 ダウンロードファイルは7zipで解凍するのがお勧めだそうです。これも前段階でやってたのでラッキーだ。 解凍ディレクトリを「ffmpeg」みたいにリネームして「C:/」の直下に置きました。どこに置いてもいいんだけど置いたパスは覚えておきましょう。 ## PATHを通す **ここが怖かったり詰んだりしたらやめておいたほうがいいです、間違えると良くないことが起こるタイプの設定です** PATHってのはコマンドショートカットのことだ! 今回は特別にPATHの通し方を書いておきます。 - 「システムのプロパティ」を開きます。 Win10での開き方は↓を参照 **Windows10で環境変数(システム環境変数、ユーザ環境変数)を追加** https://www.wannko.net/windows10/etc/kankyo.html Win7だったらWinキー押下→コンピューターを右クリック→プロパティ→左メニューのシステムの詳細設定を押下 - 画面下あたりの「環境変数」をクリック - 画面上半分の「-ログインユーザー名-のユーザー環境変数」の項目から変数「PATH」を選択して編集ボタンをクリック ※恐らくほとんどの人が既存のPATH変数があると思うのですが、もし無い場合は新規でPATH変数を作って下さい。 - 「変数値」の入力欄に既に文字列が入っていたら**そこを削ったりしないように注意**し、文字列の末尾までカーソルを移動する。 - 「変数値」の末尾に「;」(半角セミコロン)を付けて、ffmpegの配置フォルダのパス+「/bin」を記入する。 (私の場合はC:/ffmpeg/binとなる) - 追記できたらOK押して閉じる。 コマンドプロンプトを一回閉じてまた開くと環境変数が再読み込みされます。 開き直してから「ffmpeg」とコマンド発行をします。 ffmpegのバージョン情報や有効な引数などの情報がボワーと出てきたらOKです。 そんなコマンドは無いですよと表示されたらできていません…。 # botの実装コードを書く ここまで出来るともう勝ったも同然だし、やったか!?って感じです。 参考URLに書いてあるコードを丸コピペしてお手軽やったぜ~!って思ったらそんな甘い話はなくて結局段階を踏んで順次実装していくことになりました。 ## ログイン処理 まずコードのメインファイルのほうを全体コピーしてきてから、eventハンドラのon_ready内を残して全て削除する。 流石に伝わらなくなってきた感じが強いので画像を貼ります。 ![code_1](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/cc1d883f-88aa-40b9-a446-f41997e86ff5.png) 末尾のclient.run部分は消すと動かなくなる。また序盤で取得したdiscordのbot_TOKENを書いておかないとやはり動かない。 ここまで書いたらプロンプトを起動して今書いたファイルを蹴ってみる。 discordのinviteしたサーバーのユーザーを見てみると、成功したらbotがオンライン表示になる。プロンプトにはユーザ名とユーザIDが出力される。 黒塗りをグレーとかにしたらよかった。見づらい。申し訳ない。 ![kick_1](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/80bdcc70-2002-4565-8d9d-513577056a40.png) ## コマンド受け付け処理の実装 ここで異常に詰まったけど解決に至った。 ポイントは **テキストチャットを受信しているイベントハンドラ内で**メッセージにコマンドprefixが付いているものを判定して**client.process_commandsでコマンドイベントへパス**しているところです。 これがわからなくて数時間コマンドを送信してはシカトされる時間が続いてメンタルが怪しくなってきました。 ![code_2](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/f0d05b9a-1475-4005-b25f-065d324c2c65.png) これを書いて実行してから、適当なボイスチャンネルに入室してテキストチャットに「!join」コマンドを書くと… いらっしゃい ![dc_1](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/d81db4aa-c827-4530-a3b0-e0323777b3f5.png) 「!bye」コマンドで去っていきます。 ![dc_2](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/786a5928-d64c-4ea2-93a3-786db5a7aa72.png) ## この後やったこと この先は実装面の話になるのでカットするぜ!!!!!!!! - 参考URLの音声合成部分のコード丸コピーでボイスチャットでの音声読み上げは実装できた - 絵文字がUnicodeマルチバイト文字なので入力されると都度エラーが出てしまうため文字コードの変換処理をかけて除去 - サーバーカスタム絵文字を変な読み方してしまうので関数を通して除去(参考URL内にコード書いてあるページへのリンクあり) - URLを入力されると読み上げてしまうので正規表現でURLを検知して省略させる - 特定の言葉を別の言葉に読み替えるユーザ辞書機能がシステム的に無さそうなので自作 - 呼び出されたテキストチャットのものだけ読み上げるようにする - 手順漏れやコマンド入力ミスでエラーが出るようなところは防げそうな場所を大体塞いだ このあたりについてはもしわからないので教えてってなった時に連絡頂けたら個別で対応したいなって思っています! Twitterはこちらです:https://twitter.com/quakka_aa