Kaldiプレイブック(ansible)

#AnsibleによるKaldiの環境設定

研究室に新人が来たときや新入社員が入ったとき、PCを買い替えたときなどに一から環境設定するのは面倒です。
そこで環境設定が楽にできることで有名なansibleを用いてKaldiの環境設定をVirtul Box上のCentOSに設定してみました。

Kaldiは音声認識でよく使われるツールです。

#環境設定順序

１：Virtual Boxのダウンロード
２：Vagrantの設定(CentOS）
３：Ansbleの設定

1は解説が多いので下記などを参考にしてもらったら良いです。

http://pc-karuma.net/virtualbox/

#Vagrantの設定

1:Vagrantをインストール

下記を参考にして下さい。
http://osdn.jp/magazine/15/02/13/200000

2:Vagrantの設定ファイル

下記のようなVagrantfileを作成します。
`vagrant init`で初期のVagrantfileを作成可能です。

エラーが出た場合の一つの解決方法

https://compmemo.wordpress.com/2014/08/05/vagrant%E3%81%A7%E3%81%A9%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E6%89%93%E3%81%A3%E3%81%A6%E3%82%82vagrant-failed-to-initialize-at-a-very-early-stage/


```shell-session

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
		config.vm.define "ホスト名指定" do |node|
		      node.vm.box = "chef/centos-6.6"
		      node.vm.hostname = "ホスト名指定"
		      node.vm.network :private_network, ip: "ipアドレス指定"
		end
end
```

ホスト名とipアドレスを指定して仮想のOSを立てます。

下記のコマンドを入力するとVagrantが立ち上がり設定が行なわれます。

```shell-session
vagrant up
```

もし404エラーが出た場合
欲しいcentosのボックスをadd で導入します。

```
vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.6-x86_64-v20150426.box
```

導入されたosの名前を確認します。

```
vagrant box list
```

下記に示されるところに導入したボックス名を記入します。

```
node.vm.box = "chef/centos-6.6"
```

再度、立ち上げを行います。

```
vagrant up
```

sshでansibleに接続するには下記ので設定が必要なので予め設定(登録されたipアドレスがvagrantファイルと同一かチェックする必要あり）

```
 vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config
```

#Ansibleの設定

Ansibleで設定するホストを指定するため下記のファイルを作成

ansible_hosts

```shell-session
[先ほど指定したhost名]
先ほど指定したipアドレス ansible_ssh_private_key_file=Vagrantで作成されるプライベートキー ansible_ssh_user=vagrant
```

プライベートキーは下記のいずれかの直下にプライベートキーが作成される。

１：~/.vagrant.d/
２：Vagrantを設定したフォルダ/.vagrant/machines/作成したホスト名/virtualbox/

どちらかのプライベートキーを使用する。

過去にvagrantを使用してhostを作成したこごtが場合はipアドレスを変更しないとアクセス出来ないので注意が必要です。

ここからkaldiの設定を行なうansibleのymlを作成

kaldi.yml

```shell-session
---
- hosts: 設定したホスト名

  user: vagrant
  sudo: yes

  tasks:
    - name: Upgrate Package
      yum: name=* state=latest
      sudo: yes
      tags: update
    - name: Install Package
      yum: name={{ item }} state=present
      sudo: yes
      when: ansible_os_family == 'RedHat'
      with_items:
              - atlas-sse3-devel
              - atlas-devel
              - nkf
              - git
              - gcc-c++
              - zlib-devel
              - automake
              - libtool
              - autoconf
              - patch
              - subversion
              - lynx
              - graphviz
              - bc
              - vim
      tags: Install
    - name: Download Kaldi
      git: repo=https://github.com/kaldi-asr/kaldi.git dest=/home/vagrant/kaldi accept_hostkey=yes
      sudo: yes
      tags: kaldi
    - name: Install Kaldi
      command: make j 4 chdir=/home/vagrant/kaldi/tools
      sudo: yes
      tags: kaldiInstall
    - name: Install Kaldi2
      command: ./configure  chdir=/home/vagrant/kaldi/src
      sudo: yes
      tags: kaldiInstall2
    - name: Install Kaldi3
      command: make -j 4 depend chdir=/home/vagrant/kaldi/src
      sudo: yes
      tags: kaldiInstall3
    - name: Install Kaldi4
      command: make -j 4 chdir=/home/vagrant/kaldi/src
      sudo: yes
      tags: kaldiInstall4 
```

RNN部分でエラーが出るので切り分けました。原因が分かったら更新します。

```
    - name: Install RNN
      command: ./install.sh  chdir=/home/vagrant/kaldi/tools
      sudo: yes
      tags: InstallRNN
    - name: Install RNN2
      command: ./install_atlas.sh  chdir=/home/vagrant/kaldi/tools
      sudo: yes
      tags: InstallRNN2
```
言語モデルのツールでsrilmを使用する場合は別途申請が必要だが、RNNの場合は申請しなくても良い。

SRILMダウンロードページ
http://www.speech.sri.com/projects/srilm/download.html

下記のコマンドを実行するとansibleが環境を作成してくれる！！

```shell-session
ansible-playbook -i ansible_hosts kaldi.yml
```

他にも機械学習、音声認識、自然言語処理で環境が面倒だと思う方はansibleの導入を検討してみてはいかがでしょうか？

PS:

仮想環境にアクセスしたいとき

```shell-session
ssh IPアドレス -i プライベートキー
```

もしくは

```shell-session
vagrant ssh host
```

ファイルを送りたいとき

```shell-session
scp -F ~/.ssh/config ファイル名 vagrant@host:~/
```

もしくは

```shell-session
sudo sftp -F ~/.ssh/config -i .vagrant/machines/host/virtualbox/private_key 192.168.22.10
```

#ansible トラブル解決参考サイト

https://discourse.roots.io/t/fatal-192-168-50-5-ssh-error-permission-denied-publickey/4566

http://mid0111.hatenablog.com/entry/2014/06/07/190812