6715.jp

2017-05-25

クラウド東北きりたん その2 ~AzureのWindowsServerでVOICEROIDを動かす~

sekaisekai
AzureVOICEROIDWindowsServerクラウド東北きりたん

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
  • DefaultUserName
    • ログインするユーザ名
  • DefaultPassword
    • ログインユーザのパスワード

これで、起動時に勝手にログインするようになります。

次に、スタートメニューを出してgpedit.mscを入力してエンターし、 ユーザの構成 → Windowsの設定 → スクリプト → ログオンを開き、 VOICEROIDのEXEファイルを指定します。

これで、ログイン後に自動でVOICEROIDが起動します。

これによって、サーバ起動時に勝手にログインしてきりたんが立ち上がります。 かなり筋肉ソリューション感が強いですが、仕方がない><

起動時のエラー

Azure上だとサウンドデバイスがないので、起動時にエラーが表示され、再生ボタンが押せなくなります。 音声保存はできるので、今回は問題ありません。

PythonでVOICEROIDをサーバ化

前回PythonからVOICEROIDを操作できるようになったので、 あとはHTTPからリクエストを受けて音声ファイルを返すようにするだけです。

サーバへPythonとFFMPEGをインストールしておきましょう。 GUIがあるので普通にやるだけです。かんたん。

やりました

方針が定まったら書くだけ…… flaskを使って書きました。

VOICEROID操作のコードは前回の記事を参照してください。

ffmpegを使っているので、別途用意が必要です。 必要なPythonのライブラリはpypiwin32flaskです

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を得ることができるようになりました。 コレでブラウザさえあればきりたんボイスが聴けてしまうわけです。ああ^~きりたんかわいい!!!!

次回は、コイツを更に改造してきりたんボイスをライブストリーミングしてみる実験です。


  1. Microsoft Imagineは終了したらしいです。