HOME > Various Tips > 音声合成の活用 > WSLの環境構築


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プログラムを動作させる




WLS


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の動作環境を紹介する予定です。







更新履歴

2019.01.28

 
  • 「WSL(Windows Subsystem for Linux)について」に注意点(Note)を追加
  • 「Pythonの導入」、「Rubyの導入」に実行ファイルの保存先を追加
  • 「WSLの導入」で日本語言語パックのインストールが抜けていたので追加

2019.01.22

 
  • 「環境構築の概要」を「WSLの導入」に変更
  • 「WSLの導入」に手順を追加
  • 「Pythonの導入」の環境変数の設定で、.bashrcを.bash_profileに修正

2019.01.17: 新規追加