🎄

AITuberのためのVOICEVOX環境構築(WSL2編)

2023/12/21に公開

はじめに

最近発売された「AITuberを作ってみたら生成AIプログラミングがよくわかった件」という本を買いました!
https://bookplus.nikkei.com/atcl/catalog/23/10/31/01079/
今回はAITuberの声となるVOICEVOXをWSL2から使えるように環境構築していきます。

WSL2環境からWindows上のVOICEBOXへのアクセス方法が書かれていなかったので自分で調べて設定してみました。AITuberの仮想環境づくりに少しでもお役に立てれば幸いです!思わぬところでつまづいてしまったので、みなさんにもシェアしていきたいと思います。

今回の開発環境

AITuberのための環境構築シリーズ(WSL2編)
https://zenn.dev/yasuna/articles/a02113a90e2b39
https://zenn.dev/yasuna/articles/b3eae0ed00e665

AITuberの声「VOICEVOX」とは

VOICEVOXのWEBサイトの説明では「無料で使える中品質なテキスト読み上げソフトウェア」とあります。とはいえずいぶん高品質な読み上げソフトウェアだと思います!
AITuberの声の部分としてこちらのVOICEVOXがプログラム上から使えるように環境づくりをしていきます。
https://voicevox.hiroshiba.jp/
以下の「ダウンロード」を押してWindowsにアプリケーションをダウンロードしておきます。

VOICEVOXをダウンロードしてインストールしてある状態から以下の設定を始めていきましょう。

Windows上のVOICEVOXにWSL2からアクセスする

WSL2でAITuberのプログラムを作っていこうとしているので、VOICEVOXにもこのWSL2からアクセスしていきたいです。
今回はWSL2からWindows上にダウンロードしたVOICEVOXのサーバーにアクセスしようと思います。

詰まったところ

前提としてWindows上にダウンロードしたVOICEVOXアプリケーションにアクセスするには同じWindows環境からじゃないとアクセスできません。

そして、WSL2はWindows上から操作できますが、Windows上に作ったLinuxシステムという仮想環境にあるので同じWindows環境とは言えません。この前提にたどり着くまでに時間がかかっていまいましたので、みなさんもお気をつけください。
*技術的にできないことはないかもしれませんが、今回はできない前提で進めていきます

解決策

結論、Windows環境に外部からアクセスするための「ngrok」というツールを導入します
これによってWindows上にあるVOICEVOXのサーバーにWSL2などのWindowsの外部からアクセスするためのエンドポイントとなるURLを簡単に作ることができます。

ngrokの導入

ngrokの導入には以下のURLにアクセスします。
https://ngrok.com/download

まずは右上のSingUPからngrokのアカウントを新規作成しておきましょう。

今回はWindows版のZipファイルをダウンロードしていきます。

ZIPファイルが解凍できたら、PowerShellからアカウント作成したngrokのトークンを設定していきます。
解凍したファイルの中からngrok.exeファイルを開くと、Powershellが起動します。

NAME:
  ngrok - tunnel local ports to public URLs and inspect traffic

USAGE:
  ngrok [command] [flags]

DESCRIPTION:
  ngrok exposes local networked services behinds NATs and firewalls to the
  public internet over a secure tunnel. Share local websites, build/test
  webhook consumers and self-host personal services.
  Detailed help for each command is available with 'ngrok help <command>'.
  Open http://localhost:4040 for ngrok's web interface to inspect traffic.

Author:
  ngrok - <support@ngrok.com>

TERMS OF SERVICE: https://ngrok.com/tos

EXAMPLES:
  ngrok http 80                           # secure public URL for port 80 web server
  ngrok http --domain baz.ngrok.dev 8080  # port 8080 available at baz.ngrok.dev
  ngrok http foo.dev:80                   # tunnel to host:port instead of localhost
  ngrok http https://localhost            # expose a local https server
  ngrok tcp 22                            # tunnel arbitrary TCP traffic to port 22
  ngrok tls --domain=foo.com 443          # TLS traffic for foo.com to port 443
  ngrok start foo bar baz                 # start tunnels from the configuration file

COMMANDS:
  api                            use ngrok agent as an api client
  completion                     generates shell completion code for bash or zsh
  config                         update or migrate ngrok's configuration file
  credits                        prints author and licensing information
  diagnose                       diagnose connection issues
  help                           Help about any command
  http                           start an HTTP tunnel
  service                        run and control an ngrok service on a target operating system
  start                          start tunnels by name from the configuration file
  tcp                            start a TCP tunnel
  tls                            start a TLS tunnel
  tunnel                         start a tunnel for use with a tunnel-group backend
  update                         update ngrok to the latest version
  version                        print the version string

OPTIONS:
      --config strings    path to config files; they are merged if multiple
  -h, --help              help for ngrok
      --metadata string   opaque user-defined metadata for the tunnel session
  -v, --version           version for ngrok

ngrok is a command line application, try typing 'ngrok.exe http 80'
at this terminal prompt to expose port 80.
C:\Users\USER\Downloads\ngrok-v3-stable-windows-amd64>

この画面になったら以下のコマンドでトークンを設定します。

ngrok config add-authtoken <token>

そして、VOICEVOXのサーバーが立ち上がっているport50021番を指定します。

ngrok http 50021

実行結果は以下のようになりました。

Session Status             online         
Account                       アカウント名 (Plan: Free)  
Version                       3.4.0 
Region                        Japan (jp)
Latency                       11ms
Web Interface                 http://127.0.0.1:4040 
Forwarding                    https://<作成されたアドレス>.ngrok-free.app -> http://localhost:50021
Connections                   ttl     opn     rt1     rt5     p50     p90
                                0       0       0.00    0.00    0.00    0.00    

これでngrok側の設定は完了です!

WSL2からVOICEVOXにアクセスする

ngrokの設定ができたので、WindowsでVOICEVOXを起動させておきます。
http://127.0.0.1:50021/docs
にアクセスできてドキュメントが表示されれば起動完了です。

ではWSL2で以下のpythonファイルを作成して実行してみましょう。

urlの部分は先程の出力結果にある「https://<作成されたアドレス>.ngrok-free.app」の部分と置き換えます。

import requests
import json

url = 'https://<作成されたアドレス>.ngrok-free.app/'
text ='こんにちは'
speaker_id = 1
item_data = {
    "text": text,
    "speaker": speaker_id
}

    
res = requests.post(url+'audio_query',params=item_data)
res_json = res.json()
print(res_json)

このファイルを実行していきましょう。

(.venv) yasuna:~/projects/aituber $ python3 test.py

出力結果が出ました!これでWSL2からVOICEVOXにアクセスできるようになりました。

(.venv) yasuna:~/projects/aituber $ python3 test.py
{'accent_phrases': [{'moras': [{'text': 'コ', 'consonant': 'k', 'consonant_length': 0.10002632439136505, 'vowel': 'o', 'vowel_length': 0.15740256011486053, 'pitch': 5.714912414550781}, {'text': 'ン', 'consonant': None, 'consonant_length': None, 'vowel': 'N', 'vowel_length': 0.08265873789787292, 'pitch': 5.8854217529296875}, {'text': 'ニ', 'consonant': 'n', 'consonant_length': 0.03657080978155136, 'vowel': 'i', 'vowel_length': 0.117112897336483, 'pitch': 5.998487949371338}, {'text': 'チ', 'consonant': 'ch', 'consonant_length': 0.08808862417936325, 'vowel': 'i', 'vowel_length': 0.09015568345785141, 'pitch': 5.977110385894775}, {'text': 'ワ', 'consonant': 'w', 'consonant_length': 0.08290570229291916, 'vowel': 'a', 'vowel_length': 0.2083434909582138, 'pitch': 6.048254013061523}], 'accent': 5, 'pause_mora': None, 'is_interrogative': False}], 'speedScale': 1.0, 'pitchScale': 0.0, 'intonationScale': 1.0, 'volumeScale': 1.0, 'prePhonemeLength': 0.1, 'postPhonemeLength': 0.1, 'outputSamplingRate': 24000, 'outputStereo': False, 'kana': "コンニチワ'"}

まとめ

WSL2からWindows上にあるVOICEVOXにアクセスするにはngrokというツールを使うのが簡単で便利でした!
AITuberを作ろうとすると環境構築まわりで色々大変ですが、ネットワークの勉強になりますね。
あと少しで環境構築が終わりそうなので、もう少し頑張りまーす!

ここまで読んでいただいてありがとうございました!

参考

設定できずに困りはてていましたが、この記事に救われました!神!感謝!
https://qiita.com/uezo/items/5ac782392a17a8c0b79f

GitHubで編集を提案

Discussion