AzureのWindowsServerでVOICEROIDを動かします
前回の続きです。
あらすじ
前回はPythonからWin32APIをバシバシ叩いてきりたん好きなコトを喋らせることができるようになったのでした。
今回は、クラウドサービス上(というか適当なサーバ)できりたんに働いてもらおうと思います。
Microsoft Azure
Microsoft AzureのVirtual Machinesでは、WindowsServerのインスタンスを立ち上げることが出来ます。 そのへんのWindows VPSサービスを比べるとちょっと割高な感じはします。(それはそう)
なんかAzureではWindows Client(普通のWindows 10とか)も使えるっぽいんですが、 MSDNサブスクリプションが必要とかでアレなので、今回はWindowsServerで行きます。
ぶっちゃけKVMベースのVPSサービスならWindowsが普通にインストールできるような気がしますが、 契約関係で怖い人から怒られるので避けるのが無難です。
学生なら、Microsoft Imagine(旧Dreamspark)からWindows Sever 2016のライセンスがタダでもらえるので、コレを使って自宅鯖を建てるのもアリかと思います。1
インスタンス作成
Azure Portalから適当にインスタンスを作ります。 インスタンスのサイズですが、メモリ0.75GBだとかなり厳しさがあるので1.75GBが最低ラインな感じがあります。
あと、デフォルトだと鬼高いサイズしか表示されなくて焦るんですが、 サポートされるディスクの種類をSSDにして、全て表示を押すとお手頃サイズが出てきます。
ボクは無料試用クレジットを使い切るために強めのインスタンスを建てました。
インスタンスを作成したときに勝手にネットワークセキュリティグループというリソースが作成されており、 この設定を変えてポートを開けないとリモートデスクトップ接続(RDP)ができません。
対象のネットワークセキュリティグループを開いて、受信セキュリティ規則 → 追加で設定画面を開き、 サービスからRDPを選択して許可します。
このあとHTTPも使うので、ついでにHTTPを許可する設定も追加しておきましょう。 先程と同様にして設定画面を開き、サービスからHTTPを選択して許可します。
サーバ設定
WindowsServerを使う場合は、いろいろ設定が必要になります。 普通のWindowsを使う場合は不要なものも多いので、軽く目を通す程度で。
RDP
リモートデスクトップ接続(RDP)を使ったほうが色々便利なので、そうします。 Azureだと、勝手にONになっているのでこの設定は不要です。
サーバマネージャを起動して、ローカルサーバ → リモートデスクトップ → このコンピュータへのリモート接続を許可するにチェックを入れてOKを押します。
.NET Framework
普通のWindowsだと必要になったときにダイアログが出てきて簡単にインストールできますが、 WindowsServerだとそうはいきません。
サーバマネージャを起動して、管理 → 役割と機能の追加 → .NET Framework 3.5 Featuresにチェックを入れてインストールします。
ファイアウォール
このあとHTTPをきりたんと通信するインタフェースとして使うので、80/tcp
を開放します。
サーバマネージャを起動して、ローカルサーバ → Windowsファイアウォール → 詳細設定 → 受信の規則 → 新しい規則 で出てくるダイアログに従って、80番ポートを開放します。
IEの制限解除
WindowsServerではデフォルトでIEが機能制限されているので、解除します。 この後Pythonをインストールしたりするときに問題があるためです。
サーバマネージャを起動して、ローカルサーバ → IEセキュティ強化の構成 → Administratorsグループ → オフにチェックを入れてOKを押します。 今回はいろいろラクをするためにAdministratorで進めていきますが、一般ユーザで行う場合はUsersグループのセキュティ強化の構成をオフにしてください。
VOICEROIDのインストール
普通にインストーラからインストールできます。 1ライセンスで1PCにしかインストール出来ないので、注意しましょう。
ライセンス認証
サーバ起動後、一度でもRDPで接続しているとライセンス認証に失敗するようになります。 多分、ライセンス認証ドライバ(Sentinel LDK License Manager)がRDPを検知して爆発してるからです。 RDPで繋ぐような環境で使うな!!!ってことっぽいのでちょっとグレーかもしれません……
回避策として、RDPで繋ぐ前にきりたんを起動してしまいます。
- 起動時に自動ログインさせる
- ログイン時にきりたんを自動起動する
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
に以下の3つのキーを作成します。
- AutoAdminLogon
- DWORDで値は
1
- DWORDで値は
- DefaultUserName
- ログインするユーザ名
- DefaultPassword
- ログインユーザのパスワード
これで、起動時に勝手にログインするようになります。
次に、スタートメニューを出してgpedit.msc
を入力してエンターし、 ユーザの構成 → Windowsの設定 → スクリプト → ログオンを開き、 VOICEROIDのEXEファイルを指定します。
これで、ログイン後に自動でVOICEROIDが起動します。
これによって、サーバ起動時に勝手にログインしてきりたんが立ち上がります。 かなり筋肉ソリューション感が強いですが、仕方がない><
起動時のエラー
Azure上だとサウンドデバイスがないので、起動時にエラーが表示され、再生ボタンが押せなくなります。 音声保存はできるので、今回は問題ありません。
PythonでVOICEROIDをサーバ化
前回PythonからVOICEROIDを操作できるようになったので、 あとはHTTPからリクエストを受けて音声ファイルを返すようにするだけです。
サーバへPythonとFFMPEGをインストールしておきましょう。 GUIがあるので普通にやるだけです。かんたん。
やりました
方針が定まったら書くだけ…… flaskを使って書きました。
VOICEROID操作のコードは前回の記事を参照してください。
ffmpegを使っているので、別途用意が必要です。 必要なPythonのライブラリはpypiwin32
とflask
です
pip install pypiwin32 flask
コード
# coding: UTF-8
import flask
import subprocess
app = flask.Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def get():
r = flask.request
text = r.form['text'] if r.method == "POST" else r.args.get('text', None)
if text == None:
return 'plz specify `text`'
completed = subprocess.run(
['python', 'talk.py', text],
encoding='ascii',
stdout=subprocess.PIPE,
timeout=30
)
return flask.send_from_directory('./', completed.stdout.strip())
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=80)
注意
一度適当なテキストを読み上げさせ、スクリプトを実行するディレクトリに保存させておく必要があります。 保存先ダイアログを操作するときに、保存先ディレクトリを変更せずに保存させるため、 スクリプトの実行ディレクトリと同じところがデフォルトになっていないと以後の処理が失敗します。
手抜きです……
次回予告
ということで、HTTPで好きなテキストをVOICEROIDに送って読み上げたWAVを得ることができるようになりました。 コレでブラウザさえあればきりたんボイスが聴けてしまうわけです。ああ^~きりたんかわいい!!!!
次回は、コイツを更に改造してきりたんボイスをライブストリーミングしてみる実験です。
- Microsoft Imagineは終了したらしいです。↩