HAL 記事一覧

hal コマンドの解説

公開日時:2016/12/15 21:08

目次

    自動インストールスクリプトで HAL をインストールすると、ソケットサーバー「HAL」の起動を簡単にする hal コマンドが作成されます。

    この hal コマンドでは、HAL、Julius、voice_client を同時に起動、停止します。HAL を単体で利用する(Julius による音声認識を利用しない)場合は、

    sudo php -q /var/www/HAL/system/hal.php
    

    のようにして、hal.php のみを起動して下さい。

    起動
    sudo hal start
    
    停止
    sudo hal stop
    
    再起動
    sudo hal restart
    
    sudo hal reboot
    
    HAL の自動起動設定
    sudo hal auto
    
    sudo hal enable
    
    HAL の自動起動解除
    sudo hal disable
    

    サンプル・アクションを使ってみよう

    公開日時:2016/12/15 21:07

    ソケットサーバー「HAL」の version 2.0 では、アクションが機能単位に分割され、使いたいアクションのみを選んでインストールしたり、アンインストールしたり出来るようになっています。

    ユーザーは自由なアクションを定義して HAL に追加できますが、どのようにアクションを記述したら良いのか分かるよう、サンプルのアクションを用意しています。

    以下のサンプルアクションは自由に改変していただいて構いません。お好きなアクションをインストールしていただき、アクション記述の参考にして頂ければ幸いです。

    サンプルアクションのインストールとアンインストール

    サンプルアクションをインストールするには、

    sudo bakepi -g [string アクションタイプ] [string アクション名] [string チェクサム]
    

    のように bakepi コマンドを -g オプションで実行し、HAL を再起動します。例えば voice の chat アクションは

    sudo bakepi -g voice chat 19dfd9d6b9a651d39656e9f37554a386b4a24018
    

    のようにした後、

    sudo hal restart
    

    とします。

    また、アクションをアンインストールするには bakepi コマンドを -r オプションで実行します。

    sudo bakepi -r [string アクションタイプ] [string アクション名]
    

    その後、

    sudo hal restart
    

    で HAL を再起動して下さい。

    サンプルアクション一覧

    タイプ アクション名 チェックサム 概要
    net brightness 84a1bcdcd109a74fde988448fd7488b00ab75af5 WEBアプリケーションから Raspberry Pi に接続した明るさセンサーにアクセスして値を取得します。
    net light 60bf71d127661a285b3c3fd91146f2ed45e61c29 WEBアプリケーションから Raspberry Pi に接続した赤外線 LED を操作し、赤外線リモコン信号を送信します。
    sensor volume f74339443f33e7e6cf3484d5eb420e7c25a6da57 Raspberry Pi に接続した半固定抵抗の値を読み取り、Raspberry Pi のボリュームに適用します。
    voice chat 19dfd9d6b9a651d39656e9f37554a386b4a24018 雑談を行います。
    voice common b5b1255f819abaaa1ce4075b2255aabd097275d6 同意・キャンセルといった、システム共通の対話用アクションです。
    voice dummy ea50bc29ba370dcf77b9907494e9e311fbe91f59 Juliusを起動するための初期認識文法を含んだアクションです。
    voice joke 1705f52bc78578a0784724065853f4245072c628 冗談を言います。
    voice language ad7862413199b69d7596e90aec92ffb405cfdadc 言語切り替え用アクションです。
    voice light 6b8feac1257b918df5d524c894ec2dac3d0e51c0 Raspberry Pi に接続した赤外線 LED を操作し、赤外線リモコン信号のスキャンや送信を行います。
    voice music edd32f62252783f30d6e7ee587c1dc4f04854d08 プレイリストの再生を行うための認識文法を含んだアクションです。
    voice musicPlay 8d654a2d25f22d63f4936acbe257377a8823fe04 音楽リストの取り込みと再生を行います。
    voice news 1466136f68de39ef2633bb805c2474fbd9cc9c9a NHK ニュース RSS を取得し、読上げを行います。
    voice noodle 89d83b01d034c860ff5aab145c835f8eb3929066 カップラーメンタイマーです。
    voice speachEngine bb096dd37e9317c6c6f54c115fae0f98169047fd スピーチエンジンの切り替え用アクションです。
    voice system 05b703b91ffd6e68f406c8c9802c3aa4f50dbed4 HAL と Raspberry Pi を操作するシステム用アクションです。
    voice temperature 30c49cc0c2765389b7ae54fc79b544faf2a7a536 Raspberry Pi に接続した温度計で、現在の温度を取得します。
    voice time c95422de6c9452e9557a0817cb83d73e35d2be5c 現在の時刻を取得します。
    voice volume 6de05d8e186af199303926e974b794c9374566f8 Raspberry Pi の音量を操作します。
    voice weather 0c8552dfa803b8fe9cb48b744ab30a615912149b livedoor「Weather Hack」から RSS を取得し、読上げを行います。
    voice welcomeBack 0eb6b9e187db4ddd28353cdc17a29d36dc90300a Raspberry Pi に接続した人感センサーを使って、あなたの帰宅を迎えてくれます。

    サンプルアクション「Voice_Chat」の説明

    公開日時:2016/12/14 21:15

    サンプルアクション「Voice_Chat」は、簡単な雑談をするサンプルアクションです。

    特に難しいことはしていません。音声入力に対して、乱数または時間で、応答メッセージにバリエーションを持たせています。

    ソースコード

    Chat.yml
    ## Chat YAML.
    ---
    -
        type:   "ありがとう?"
        do:     "chat_thanx"
    -
        type:   "(今日)?は?疲れた(よ|ね)?"
        do:     "chat_tired"
    -
        type:   "おはよう?"
        do:     "chat_good_morning"
    -
        type:   "おやすみ?"
        do:     "chat_good_night"
    -
        type:   "\\A(あなた|お前|君)は?誰\\z"
        do:     "who_are_you"
    
    Chat.php
    <?php
    /* *
     * 
     * socket server HAL v2.0
     * 
     * (c) 2016 Katsuhiko Miki
     * 
     * */
    namespace Feijoa\HAL\Action\Voice;
    use Feijoa\HAL as HALSYS;
    
    class Chat extends HALSYS\Action\BaseAction
    {
    
         /**
         * 呼び出し元クラス名を返すImplementsメソッド
         * 
         * @return string       // クラス名
         */
        public static function getClass(){ return __CLASS__; }
    
        /**
         * インターバル毎のイベント
         * 
         * @param \Feijoa\HAL\HALDto $dto
         */
        public static function sensor(HALSYS\HALDto $dto)
        {
        }
    
         /**
         * ありがとう
         * 
         * @param \Feijoa\HAL\HALDto $dto
         */
        public static function chat_thanx(HALSYS\HALDto $dto, $read_sock)
        {
            $rand = mt_rand(1, 3);
            switch(true){
                 case $rand === 1:
                    self::say($dto, "thanx1", "あなたのパートナーとして、当たり前のことです");
                    break;
                 case $rand === 2:
                    self::say($dto, "thanx2", "そう言っていただけるとうれしいです");
                    break;
                default:
                    self::say($dto, "thanx3", "どういたしまして");
                    break;
            }
        }
    
        /**
         * 疲れた
         * 
         * @param \Feijoa\HAL\HALDto $dto
         */
        public static function chat_tired(HALSYS\HALDto $dto, $read_sock)
        {
            $rand = mt_rand(1, 2);
            switch(true){
                case $rand === 1:
                    self::say($dto, "i_am_tired_1", "大丈夫ですか?ゆっくり休んでください");
                    break;
                default:
                    self::say($dto, "i_am_tired_2", "お疲れ様でした。ビールでも飲んでゆっくりしましょう");
                    break;
            }
        }
    
        public static function chat_good_morning(HALSYS\HALDto $dto, $read_sock)
        {
            $time = (int)date("Hi");
            if($time < 400){
                self::say($dto, "morning_0", "まだ深夜のようですが、よく眠れませんでしたか?");
            } else if($time < 600){
                self::say($dto, "morning_1", "おはようございます。随分お早いですね");
            } else if($time < 900){
                self::say($dto, "morning_2", "おはようございます。");
            } else if($time < 1000){
                self::say($dto, "morning_3", "おはようございます。今日はゆっくりですね");
            } else if($time < 1200){
                self::say($dto, "morning_4", "おはようというには遅すぎるきがします");
            } else if($time < 2359){
                self::say($dto, "morning_5", "どうお返事したら良いのか迷います");
            }
        }
    
        public static function chat_good_night(HALSYS\HALDto $dto, $read_sock)
        {
            $time = (int)date("Hi");
            if($time < 400){
                self::say($dto, "good_night_0", "遅くまでお疲れ様でした。ゆっくりお休みください");
            } else if($time < 1900){
                self::say($dto, "good_night_1", "変わった時間におやすみになるのですね");
            } else if($time < 2100){
                self::say($dto, "good_night_2", "お早いおやすみですね。ゆっくりお休みください");
            } else {
                self::say($dto, "good_night_3", "おやすみなさい");
            }
        }
    
        public static function who_are_you(HALSYS\HALDto $dto, $read_sock, $args)
        {
            self::say($dto, "who_are_you", "わたしは:@NAMEです");
        }
    }
    
    Chat.julius.yml
    ## Chat Julius YAML.
    ---
    rules:
        - "SINGLE"
        - "ZATSUDAN_"
        - "WHAT_ ZATSUDAN_"
        - "YOU_ WHO"
    alias:
        ZATSUDAN_:
            - "ZATSUDAN"
            - "ZATSUDAN NE"
            - "ZATSUDAN YO"
        WHAT_:
            - "WHAT"
            - "WHAT HA"
            - "WHAT MO"
        YOU_:
            - "YOU"
            - "YOU HA"
    words:
        SINGLE:
            -
                word:   "ありがとう"
                kana:   "アリガトウ"
            -
                word:   "おはよう"
                kana:   "オハヨウ"
            -
                word:   "おやすみ"
                kana:   "オヤスミ"
        WHAT:
            -
                word:   "今日"
                kana:   "キョウ"
        ZATSUDAN:
            -
                word:   "疲れた"
                kana:   "ツカレタ"
        YOU:
            -
                word:   "あなた"
                kana:   "アナタ"
            -
                word:   "お前"
                kana:   "オマエ"
            -
                word:   "君"
                kana:   "キミ"
        WHO:
            -
                word:   "誰"
                kana:   "ダレ"
        HA:
            -
                word:   "は"
                kana:   "ワ"
        MO:
            -
                word:   "も"
                kana:   "モ"
        NE:
            -
                word:   "ね"
                kana:   "ネ"
        YO:
            -
                word:   "よ"
                kana:   "ヨ"
    
    

    HAL のインストーラー・スクリプト詳細

    公開日時:2016/12/14 21:07

    さて、これからソケットサーバー「HAL」のインストールについて説明します。まず、ユーザーのホームディレクトリに移動して下さい。

    cd ~
    

    HAL version 2.0 から、環境構築を自動で行うためのシェルスクリプトが提供されました。

    シェルスクリプトとは、ソフトウェアのインストール等を行う際に入力するコマンドを記述しておき、そのスクリプトを実行することで、煩雑な処理を自動化するための簡単なプログラムです。

    このプログラムは、

    wget -O setup_trial.sh "http://feijoa.jp/getFile/?place=products&filename=setup_trial.sh"
    

    で取得できます。内容については、ただのテキストファイルですので、

    cat setup_trial.sh
    

    等で確認できます。

    この setup_trial.sh に chmod で実行権限を与え、スクリプトを実行してください。いくつかの質問に対して入力を行えば、ソケットサーバー「HAL」の環境構築が全て自動で終わります。時間は約 40 分、OpenCV もインストールする場合は全部で 1 時間程です。

    sudo chmod +x setup_trial.sh
    
    sudo ./setup_trial.sh
    

    インストール作業はこれだけです。全てのインストールが終わり、Raspberry Pi を再起動したらログインし、

    sudo hal start
    

    で、HAL が起動します。

    HAL 環境構築前の質問事項

    以下に、インストール前の質問事項の詳細を記します。

    Please input the target HAL package name (e.g. HAL_trial.tar.gz)

    インストールするHAL体験版のパッケージ名を入力して下さい。

    例)HAL_trial.tar.gz

    ※製品版ではこの項目はありません。

    Please input the sha1 check sum

    インストールするHAL体験版のSHA-1チェックサムを入力して下さい。ダウンロードされたファイルが破損していないか? 改ざんされていないか? をチェックします。

    ※製品版ではこの項目はありません。

    Which nettwork card that you want to use with HAL (default=eth0)

    HALで利用するネットワークカード名を入力して下さい。例えば有線LANを利用する場合はeth0、無線LANを利用する場合はwlan0 等でしょう。(エンターを入力すると、自動で eth0 が設定されます)

    Please input the WEB account (default=hal)

    webapps ディレクトリ内の WEB アプリケーションフレームワークのログインアカウント名を、任意の英数字で入力して下さい。

    Please input the WEB password (default=halpass)

    webapps ディレクトリ内の WEB アプリケーションフレームワークのログインパスワードを自由に入力して下さい。8文字以上の英数字記号を混ぜることをお勧めします。

    Please input the directory path of HAL (default=/var/www/HAL)

    HAL をインストールするディレクトリパスを指定して下さい。(エンターを入力すると、自動で /var/www/HAL ディレクトリにインストールされます)

    Please input Timezone of PHP (default=Asia/Tokyo)

    PHP に設定するタイムゾーンを指定して下さい。(エンターを入力すると、自動で Asia/Tokyo に設定されます)

    Please input DocumentRoot path of Apache (default=${HAL_ROOT}/webapps/public)

    Apache に設定するドキュメントルートパスを指定して下さい。(エンターを入力すると、自動で /HAL/webapps/public/ ディレクトリに設定されます)

    Use SSL [y/N] (default=N)

    SSLサーバー認証用の自己署名証明書を Apache にインストールするか設定します。(エンターを入力すると証明書設定はインストールされず、HTTPS通信は準備されません。yを実行する場合は、事前に自己証明書を作成して下さい)

    ※『SSL通信用自己証明書の発行手順』に添って、鍵ファイルを作成している場合に表示されます。

    Would you like to install openCV? [y/N] (default=N)

    OpenCV ライブラリをインストールするか設定します。OpenCV ライブラリをインストールすると簡単に顔認識等ができるようになりますが、コンパイルに非常に時間がかかります。(エンターを入力すると OpenCV はインストールされません)

    Reboot when an instration has done. [Y/n] (default=Y)

    全てのインストール後、Raspberry Pi を再起動するかどうか設定します。(音声設定を有効にするには、Raspberry Pi の再起動が必要です)

    自動インストール内容詳細

    自動インストールは約 40 分程(もし OpenCV をインストールする場合は +20分程)で終わります。エラーが発生しない限り、上記の質問の後は最後まで自動でインストールが行われるので、何か別のことをして放置していただいて構いません。

    以下に、何をインストールしているのかを記します。もし不要なインストールがある場合はシェルスクリプトを編集して不必要な部分を削って下さい。

    なお、再度自動インストールシェルスクリプトを実行する場合、基本的には既にインストールされているアプリケーションはスキップされます。

    • HAL パッケージのダウンロードと設置
    • 赤外線信号スキャン・送信プログラムのコンパイル
    • sudo apt-get update
    • vim のインストール
    • 日本語フォントのインストール
    • 日本語入力 IME のインストール(ibus-anthy)
    • 日本語表示プログラムのインストール(jfbterm)
    • 音声ライブラリのインストール(alsa-utils sox libsox-fmt-all)
    • 音声設定
    • ビルドアプリケーション管理ソフトのインストール(paco)
    • WEBサーバーのインストールと設定(Apache2)
    • 自動起動設定アプリケーションのインストール(chkconfig)
    • メモリキャッシュシステムのインストール(memcached)
    • PHP5 と必要なライブラリのインストール(PHP)
    • PHP の YAML エクステンションのインストール
    • PHP の暗号化ライブラリのインストール(ionCube Loader)
    • git システムのインストール
    • WiringPi のインストール
    • WiringPi-PHP のインストール
    • Julius、及びディクテーションキット、文法認識キットのインストール
    • 日本語発声エンジンのインストール(hts_engine API、Open JTalk、辞書、MMDAgent、発声スクリプト)
    • MP3 再生プログラムのインストール(mpg321)
    • 多国言語発声プログラムのインストール(eSpeak)
    • 画像処理ライブラリのインストール(OpenCV)
    • HAL 用ユーティリティのインストール(bakepi)
    • HAL 起動、停止スクリプトのインストール(hal)
    • HAL の基本 Julius 用のファイルをコンパイル
    • HAL の WEB アプリケーション用アカウントの設定
    • Systemd 用の HAL 自動起動スクリプトの設定
    • HAL で利用する IP アドレスの設定

    以上です。

    HAL のファーストステップ

    公開日時:2016/12/14 21:07

    Raspberry Pi はとても高性能で便利なコンピューターですが、とても自由度が高く、高性能過ぎてどう使ったら良いのか迷ってしまうという人が多いようです。

    ソケットサーバー「HAL」はそういう人のためにつくられたサーバー・アプリケーション・フレームワークで、ちょっとしたアイデアをすぐに形にすることができるように作られています。

    しかし、これまでの HAL は沢山の関連アプリケーションを手動でインストールせねばならず、環境を構築するまでが大変でした。

    HAL version 2.0 では、この環境構築を自動で行うシェルスクリプトが提供されています。

    基本的には、まっさらな状態の Raspberry Pi で、シェルスクリプトを実行するだけで HAL の実行環境が自動でインストールされます。

    このページでは、その流れをご説明します。

    HAL の実行に必要なもの

    HAL の実行にあたっては、Raspberry Pi に Raspbian OS がインストールされている事が条件ですが、「自動インストールスクリプト」を利用するにあたっては、他に USB マイクがあると良いでしょう。

    HAL は単体でも動作しますが、音声認識エンジン「Julius」と併せて利用すると、より一層 Raspberry Pi の楽しさを体験できるでしょう。自動インストールスクリプトでインストールされる環境は、音声認識を利用することを想定して構築されます。このため、以下のような USB マイクを準備することをお勧めします。

    Raspberry Pi にはアナログマイク端子は無いので、USB マイクが必要です。上記でなくてもかまわないので、お好みのマイクを用意して下さい。

    また、各種ソフトウェアはインターネットからダウンロードしてインストールされます。ですから、事前にインターネットに繋がる環境を構築しておく必要があります。

    インストール前に最低限やっておきたいこと

    HAL をインストールする前に、最低限やっておきたいことを『ラズパイの最低限セキュリティ・セッティング』に記しました。

    HAL を安全に利用するために、是非、上記の設定を行っておきましょう。

    HAL のインストール

    さて、root パスワードの設定、SSH の設定、SSL 認証設定が終わったら、いよいよ、HAL のインストールです。

    冒頭で説明したとおり、HAL のインストールはほぼ完全に自動で行われます。インストールにかかる時間は大体 40 分程度(OpenCV をインストールする場合は 60 分程度)で、最初だけ質問に答える必要がありますが、あとは放置で構いません。

    インストールがどんな感じで行われるのか、動画を作成しましたのでご覧になって下さい。感覚がつかめると思います。

    では、自動インストールスクリプトの入手方法ですが、まず、ターミナルを開いて wget で自動インストールスクリプトをダウンロードします。

    wget -O setup_trial.sh "http://feijoa.jp/getFile/?place=products&filename=setup_trial.sh"
    

    次に、このスクリプトに実行権限を与えます。

    chmod u+x setup_trial.sh
    

    これで setup_trial.sh が実行できるようになったので、管理者権限で実行します。

    sudo ./setup_trial.sh
    

    あとは幾つかの質問に答えるだけで、HAL の環境が自動でインストールされます。

    このように、自動インストールが終わった後は Raspberry Pi を再起動し、ターミナルを開いて

    sudo hal start
    

    で、HAL が起動します。

    とっても簡単ですね!

    なお、HAL の起動に関するコマンドは『hal コマンドの解説』を参照して下さい。

    記事リンク