WSL環境を構築してHaruziraと通信しよう! (2019/01/22 update)
はじめに
このTipsでは、WSL(Wndows Subsystem for Linux)やAndroidスマートフォン等をClientに利用し、ネットワーク通信でHaruziraの音声合成を活用するSample Programを紹介していきます。
今回は、WSLでPythonとRubyが利用できるClient環境を構築し、簡単なプログラムを動作させてみます。
続いて次回は、同様にAndroidスマートフォンでClient環境を構築していきます。
そして、2つの環境構築後は、様々なSample Programを作成していこうと思います。
このシリーズで紹介するSample Programは、PythonやRubyが動作する環境であればOSやDeviceの制限を超えて動作します。
例えば、リアルLinuxは当然ですが、iPhoneやMac、Raspberry Pi等でも動作するはずです。
UWPアプリのHaruziraが動作するDeviceと、上記のようなClient Deviceを用意できるユーザーは、試してみて下さい
プログラムに興味があるユーザーであれば、Amazon EchoやGoogle Homeのようなオリジナルのスマートスピーカーシステムを作って遊んでみるのも面白いと思います。
自作のプログラムシステムであれば、GAFA等にプライバシー情報を収集される心配も少なくなります。
動作確認に必要な環境(WSL利用時)
Server |
Windows 10(Anniversary Update以降)が動作するDeviceまたは仮想PC UWPアプリHaruziraを動作させる |
---|---|
Client |
Windows 10(Fall Creators Update以降、1809以降推奨)が動作するDeviceまたは仮想PC pythonまたはrubyプログラムを動作させる |
WSL(Windows Subsystem for Linux)について
WSL(Windows Subsystem for Linux)は、Windows 10やWindows Server上でLinuxのバイナリ実行プログラムを動作させるためのOS上のサブシステムです。
似たような機能として、仮想PC(Virtual PC)のHyper-VやVirtualBox、VMware等が存在しますが、どちらかというとCygwinに近い機能だと感じています。
仮想PCやCygwin等と比較した場合は、次の様なメリットやデメリットが考えられます。
-
メリット
- 導入が簡単。(Microsoftストアからインストールできる)
- アンインストールも簡単で、システムを汚さない。(Microsoftストアのアプリと同様にアンインストールできる)
- 起動が早い。(MS-DOSプロンプトと同じ感覚で起動できる)
- 少ないリソースで動作するので軽快に操作できる。
- Windows OSとの連携が容易になる。
-
デメリット
- 新しい機能なので大きなバグが含まれている可能性がある。(正式リリースがFall Creators Update)
- 仮想PCで動作するプログラムが、WSLでは動作しない場合もある。(リアルLinux > 仮想PC > WSL)
- 基本的にCUIで操作する。(GUI環境(X-Window)を構築することは可能)
- 利用できるディストリビューションが少ない。(正式なFedoraは未だ)
- ネットワーク環境はOSのローカル環境を引き継ぐ。(hostsファイルなどを変更しても、再起動時に上書きされる)
上記のように、より本格的な環境が必要な場合は仮想PCを利用し、通常の開発等ではWSLを利用するのがよさそうです。
今後は、Cygwinの出番はどんどん少なくなっていくように思えます。
それから、Haruziraのようなネットワーク通信を行うUWPアプリでは、ループバック接続がセキュリティ仕様上できません。そのため、独立したネットワーク環境が構築できないのは残念なところです。
WSLの導入
WSLを利用して、Haruzira SDKのSample Programを動作させるための環境構築手順について説明します。
このTipsでは、WSLのディストリビューションとしてUbuntuを利用します。
大まかな手順の流れは、次のようになります。
- Windowsの機能の有効化または無効化で、WSLの機能を有効にする。
- MicrosoftストアからWSLパッケージをインストールする。(Ubuntu)
- WSLを起動し、ユーザー名、パスワードを設定する。
- パッケージ情報を最新の状態に更新する。
- 日本語化を行う。
- PythonとRubyを導入する
1.Windowsの機能の有効化または無効化で、WSLの機能を有効にする
コントロールパネルかまたは、ファイル名を指定して実行に「OptionalFeatures」と入力する。
2.MicrosoftストアからWSLパッケージをインストールする(Ubuntu)
3.WSLを起動し、ユーザー名、パスワードを設定する
4.パッケージ情報を最新の状態に更新する
sudo apt update
sudo apt upgrade
5.日本語言語パックのインストール
sudo apt -y install language-pack-ja
6.ロケールを日本語に設定
sudo update-locale LANG=ja_JP.UTF8
WSLを終了し、再起動する。
7.タイムゾーンをJSTに設定
sudo dpkg-reconfigure tzdata
8.日本語マニュアルのインストール
sudo apt -y install manpages-ja manpages-ja-dev
Pythonの導入
Pythonの導入手順について説明します。
pyenvを導入し、複数バージョンのPythonを切り替えて利用できるようにします。
1.gitでpyenvをインストール
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
2.環境変数の設定
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
3.pyenvのバージョン確認(正常にインストールが完了するとバージョンが表示される)
pyenv -v
pyenv 1.2.9-2-g6309aaf2
4.開発関連ツール(build-essential)や依存ライブラリのインストール
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
sudo apt-get install libffi-dev
5.インストール可能なPythonの最新バージョンをチェック
pyenv install -l
:
3.6.8
3.7.0
3.7-dev
3.7.1
3.7.2
3.8-dev
:
6.最新の安定版であるpython 3.7.2をインストール
なお、低スペック(low-end)のCPU環境では、インストールに時間がかかります。
筆者の環境(Atom x5-Z8350)では、2時間近くかかりましたので、気長に待ちましょう。(普通のCPUであれば直ぐに完了します)
pyenv install 3.7.2
pyenv global 3.7.2
7.pipのインストール状態を確認
pip list
Package Version
------------ -------
pip 18.1
setuptools 40.6.2
Python Sample Program
文字列を宛先に送信する、最も簡単なharuzira_sdkのSample Programを動作させます。
先ずは、haruzira_sdkをインストールしましょう。
1.haruzira_sdkのインストール
(haruzira_sdk, numpy, pycryptoがインストールされる)
pip install haruzira_sdk
pip list
Package Version
------------ -------
haruzira-sdk 2.1.0
numpy 1.16.0
pip 18.1
pycrypto 2.6.1
setuptools 40.6.2
2.ソースコードの作成(simple_demo.py)
# coding: utf-8
from haruzirasdk import hz_client_tcp_communication as hzcomm
clt_tcp_comm = hzcomm.ClientTcpCommunication()
clt_tcp_comm.ServerPortNo = 46000 #port number of the destination
clt_tcp_comm.ServerIP = "192.168.1.6" #ip address of the destination
clt_tcp_comm.ReqSendDataText = "Hello Haruzira!"
timestamp = clt_tcp_comm.sendSpeechDataEx()
if(timestamp is not None):
print("success. timestamp[{}]".format(timestamp))
else:
print("failed to send.")
#Stop listener thread.
clt_tcp_comm.cancelAsynchronousListener()
- 2行目:SDKを参照するための宣言。
- 4行目:通信クラスのインスタンス生成。
- 6行目:送信先Port番号の設定。(既定値46000を利用する場合は、省略可能)
- 7行目:送信先IP addressの設定。(Haruziraが起動しているServerのIP addressを指定する)
- 9行目:送信する文字列の設定。
- 10行目:送信処理。(送信が成功した場合は、送信時のタイムスタンプが返る)
- 12-15行目:送信結果の判定。
- 18行目:プログラム終了時にリスナースレッドを停止する。(Pythonの場合は、必須処理)
3.プログラムの実行手順
①Server側でHaruziraを起動し、リモート読み上げ画面でServerを起動する。
(既定値のPort番号(46000)で受信する場合は、特別な設定は不要です。)
②Sample Programの実行
ファイアーウォールの許可を求められた場合は、許可して下さい。
python simple_demo.py
success. timestamp[15:08:58]
③Server側で受信に成功すると、送信した文字列が再生されます。
Rubyの導入
Rubyの導入手順について説明します。
rbenvを導入し、複数バージョンのRubyを切り替えて利用できるようにします。
なお、rbenvではなくRVMでバージョン管理を行う場合は、rbenvのインストールは不要です。
また、rbenvとRVMは互換性がありません。rbenvを利用する場合は、rbenvをインストールする前にRVMを完全にアンインストールして下さい。(RVMを利用している場合)
1.gitでrbenvをインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
2.環境変数の設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
3.rbenvのバージョン確認(正常にインストールが完了するとバージョンが表示される)
rbenv -v
rbenv 1.1.1-39-g59785f6
4.ruby-buildのインストール
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
sudo ~/.rbenv/plugins/ruby-build/install.sh
5.インストール可能なRubyの最新バージョンをチェック
rbenv install -l
:
2.6.0-preview2
2.6.0-preview3
2.6.0-rc1
2.6.0-rc2
2.6.0
2.7.0-dev
:
6.最新の安定版であるruby 2.6.0をインストール
なお、低スペック(low-end)のCPU環境では、インストールに時間がかかります。
筆者の環境(Atom x5-Z8350)では、2時間近くかかりましたので、気長に待ちましょう。(普通のCPUであれば直ぐに完了します)
rbenv install 2.6.0
rbenv global 2.6.0
7.rubyのバージョンとgemの状態を確認
ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
gem list
*** LOCAL GEMS ***
bigdecimal (default: 1.4.1)
bundler (default: 1.17.2)
cmath (default: 1.0.0)
csv (default: 3.0.2)
date (default: 1.0.0)
did_you_mean (1.3.0)
:
gemのコマンドが見つからない等のメッセージが表示された場合は、WSLを再起動してみて下さい。
Ruby Sample Program
文字列を宛先に送信する、最も簡単なharuzira_sdkのSample Programを動作させます。
先ずは、haruzira_sdkをインストールしましょう。
1.haruzira_sdkのインストール
gem install haruzira_sdk
Fetching haruzira_sdk-2.1.0.gem
Successfully installed haruzira_sdk-2.1.0
Parsing documentation for haruzira_sdk-2.1.0
Installing ri documentation for haruzira_sdk-2.1.0
Done installing documentation for haruzira_sdk after 1 seconds
1 gem installed
gem list haruzira_sdk
*** LOCAL GEMS ***
haruzira_sdk (2.1.0)
2.ソースコードの作成(SimpleDemo.rb)
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require "haruzira_sdk"
cltTcpComm = ClientTcpCommunication.new
cltTcpComm.ServerPortNo = 46000 #port number of the destination
cltTcpComm.ServerIP = "192.168.1.6" #ip address of the destination
cltTcpComm.ReqSendDataText = "Hello i am Haruzira. Thank you!"
timeStamp = cltTcpComm.sendSpeechDataEx
if(timeStamp != nil)
puts("success. timestamp[%s]" % [timeStamp])
else
puts("failed to send.")
end
- 3行目:SDKを参照するための宣言。
- 5行目:通信クラスのインスタンス生成。
- 6行目:送信先Port番号の設定。(既定値46000を利用する場合は、省略可能)
- 7行目:送信先IP addressの設定。(Haruziraが起動しているServerのIP addressを指定する)
- 9行目:送信する文字列の設定。
- 10行目:送信処理。(送信が成功した場合は、送信時のタイムスタンプが返る)
- 12-16行目:送信結果の判定。
3.プログラムの実行手順
①Server側でHaruziraを起動し、リモート読み上げ画面でServerを起動する。
(既定値のPort番号(46000)で受信する場合は、特別な設定は不要です。)
②Sample Programの実行
ファイアーウォールの許可を求められた場合は、許可して下さい。
ruby SimpleDemo.rb
success. timestamp[16:09:31]
③Server側で受信に成功すると、送信した文字列が再生されます。
なお、次の様なwarning messageが表示される場合は、改行コードをCRLFからLFに変更してみて下さい。
warning: shebang line ending with \r may cause problems
まとめ
WSLを利用することで、Windows上にLinux環境を簡単に構築できるようになりました。
従来からLinuxを利用しているユーザーはもちろんですが、これからLinuxを始めたい方もWSLを体験してみましょう。
なお、安定する環境を構築するためにも、できるだけ最新のシステム(OS 1809以降)で導入することを推奨します。
これからプログラムを始めたい場合も、PythonやRubyといった人気のスクリプト言語で挑戦してみて下さい。
今回は、Haruzira SDKを利用した最も簡単なSample Programを用意しましたが、SDKには他にも様々なプロパティなどを実装しています。
また、.Net言語での開発にも対応しています。
今後も、Sample Programを用いて紹介していこうと考えています。
次回は、AndroidスマートフォンでPythonとRubyの動作環境を紹介する予定です。