Rapiro に音声合成で喋ってもらう

Rapiro に音声合成で喋ってもらう

RAPIRO(ラピロ)に音声合成で喋らせる

という非常に興味深いものがあったので
さっそく実践

とはいってもスピーカーなどは用意していないので
音声操作のときに使ったマイクとイヤホンを使います

まずは ssh でログイン

本来は usb のスピーカーとかマイクを優先するため

sudo vim /etc/modprobe.d/alsa-base.conf


17行めあたりを

options snd-usb-audio index=0

に書き換える必要があるけど
すでに Rapiro を音声で動かすために書き換え済み
なので
そのまま続行

設定がただしくできているかは

cat /proc/asound/modules 

を実行して

 0 snd_usb_audio
 1 snd_bcm2835

となっていればOK

ちなみに
snd_bcm2835
が0になっていると raspberryPi 本体の音源
が優先になっている

そして今回使用する
VoiceText Web API
は前回取得した API キーが必要

https://api.voicetext.jp/v1/tts
の後に様々なパラメータをつけることで
いろいろな操作が可能

簡単な解説は
https://cloud.voicetext.jp/webapi/docs/introduction
の解説をみるとわかりやすい

なおパラメータについては
https://cloud.voicetext.jp/webapi/docs/api
のAPIマニュアルをみると
パラメータの意味やエラーコードの意味が載っている

これらを元に apiキーを使って
curl で実行すると 音声ファイルを作成できる

curl "https://api.voicetext.jp/v1/tts" -o "test.wav" -u "取得したAPIキー:" -d "text=こんにちは" -d "speaker=hikari"

これは
-o “test.wav”
で出力し、保存するファイル名
今回なら test.wav に保存

-u “取得したAPIキー:”
でメールで送られてきた API キーを入力
これがないと音声合成は使えない

API key のあとに : をつけるのを忘れずに

-d “text=こんにちは”
で喋る文章を
こんにちわ
にしている

-d “speaker=hikari”

どのような音声にするかという指定
hikari なら女性の声になる
声の種類は
https://cloud.voicetext.jp/webapi/docs/api

speaker パラメータを参考に

ファイルができたら

aplay test.wav

を実行すれば
こんにちわ
とイヤホンから声が聞こえる

頻繁にAPIにアクセスできないのなら
ある程度の音声ファイルをつくっておく方法のほうが
いいのかもしれない

さらに、このAPIには
Node.js 用ライブラリがあるのでそれを使う

前回、Rapiro というディレクトリを作ったので
そこで実行してみる

 cd Rapiro/

そして
ライブラリをインストール

npm install voicetext --save

インストールはできたけど
自分の npm のバージョンを知りたかったので
npmコマンドの使い方

を参考に

npm -v

でバージョン確認

結果は
1.2.17
とりあえずインストールできたけど
今後のことも考えて

npm install -g npm@1.3.0

でバージョンをあげておく

なお
npmの1.3系ではディレクトリ名に大文字は使えない
らしいので
新しくディレクトリをつくり
そこで実行することにする

cd 
mkdir rapiro
cd rapiro

次に必要なパッケージのインストール

npm init
npm install express --save
npm install voicetext --save

あとは処理するスクリプトだけど
これは
app.js をそのまま使わせていただきました
ファイルは

vim app.js

で作成

次にサーバーを起動

node app.js

で起動するので
後はブラウザで
http://192.168.10.159:3000/rapiro/control/?text=今日は晴れるかな?
というように
http://rapiroのIP:3000/rapiro/control/?text=喋る文字列

とすればいい

これでイヤホンやスピーカーから
喋った音声が聞こえるようになる

なお、停止するには ctrl +c で停止できる

Voice Text API の登録

Voice Text API の登録

RAPIRO(ラピロ)に音声合成で喋らせる

によれば
音声合成に
HOYAのVoiceText Web APIを使うことで
安い音声合成LSI使うより
よほど自然にしゃべらせることができ
感情とかの設定も可能
とのことなので、さっそく登録

まず無料で試すため
無料利用登録をクリック

voice

名前とメールアドレス、利用目的を入力
企業、部署名は個人の場合は
個人と入力

これで登録が完了すると
メールでAPIキーが送信されてくるので
それを使う

Rapiro に node.js + express

rapiro に nodejs + express

dotinstall で
node.js と express を以前やったこともあり
今回は
RAPIRO(ラピロ)をWebサーバにする

を参考に
node.js をインストール

apache は以前インストールしたことがあるので
今回は node.js にしてみます

まずは sshでログイン

そして
node.js のバージョン管理ツール nodebrew のインストール

curl -L git.io/nodebrew | perl - setup

次に環境変数の設定

vim .bashrc


一番下の行へ

export PATH=$HOME/.nodebrew/current/bin:$PATH

を追記し保存

設定反映のため

source .bashrc

次にインストールだけど
基本的にはじめてやることは
再現性を求めるなら
同じバージョンを使うことが鉄則
でないと
自力で修正する手間が増える

nodebrew install-binary v0.10.3

これでインストール

次に使用するバージョンを設定するため

nodebrew use v0.10.3

インストールしているバージョンと
現在利用設定しているのを調べるなら

nodebrew list

もし1つだけだと

v0.10.3

current: v0.10.3

となる

次に express のインストール

まず作業ディレクトリを作成し
そこへ移動して実行する

mkdir Rapiro
cd Rapiro

次にプロジェクトの初期設定

npm init

でOK
npm はパッケージ管理で
ubuntu なら apt-get
centOS なら yum のようなもの

このコマンド実行で
package.json
が作成される

今回は全部 enter してみた
以下、質問内容

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (Rapiro) 

version: (0.0.0) 

description: 

entry point: (index.js) 

test command: 

git repository:

keywords: 

author: 

license: (BSD) 

About to write to /home/pi/Rapiro/package.json:

{
  "name": "Rapiro",
  "version": "0.0.0",
  "description": "ERROR: No README.md file found!",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": "",
  "author": "",
  "license": "BSD"
}


Is this ok? (yes) 

これで最後に

npm WARN package.json Rapiro@0.0.0 No README.md file found!

となる

次に express のインストール

npm install express --save

インストール完了したら

vim app.js

でファイル作成

内容は

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

var server = app.listen(3000, function () {

  var host = server.address().address
  var port = server.address().port

  console.log('Example app listening at http://%s:%s', host, port)

})

これは
node.js express の hello world のコード
http://expressjs.com/starter/hello-world.html

ファイルが作成できたら実行

node app.js

すると

Example app listening at http://0.0.0.0:3000

で3000ポートまちになるので

ブラウザで
http://192.168.10.159:3000/
というように
Rapiro のIP:3000
でアクセスすると
hello world が表示される
node.js

なお、終了は ctrl +c でOK

もっと詳しく node.js をやるなら
ドットインストールの node.js がおすすめ

Rapiro の音声操作その4

Rapiro の音声操作その4

今回は Julius を音声認識サーバとして機能させる

これを行うのが Julius の
モジュールモード

これを使えば独立した音声認識サーバーになる

このモジュールモードだと
音声認識結果を
Julius サーバーから
ソケット通信で他のプログラムへ渡すことができる

この仕組みを使うことで
RaspberryPi で音声認識結果を受け取る

これをやるには
rapiro.conf の
一番下の行へ
-module
を追加する

cd dictation-kit-v4.3.1-linux/

でディレクトリ移動して

sudo vim rapiro.conf

でファイルを開き編集

全部を書くと

-w rapiro.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 800
-lv 1500
-demo
-module

最後に -module を追加している

これで

 julius -C rapiro.conf 

で起動

----------------------- System Information end -----------------------

Notice for feature extraction (01),
	*************************************************************
	* Cepstral mean normalization for real-time decoding:       *
	* NOTICE: The first input may not be recognized, since      *
	*         no initial mean is available on startup.          *
	*************************************************************

Stat: capture audio at 16000Hz
Stat: adin_alsa: current latency time: 21 msec
Stat: adin_alsa: current latency (21ms) is shorter than 32ms, leave it
Stat: "default": Device [USB PnP Sound Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>

が普通に起動した Julius で

今回サーバーモードだと

Stat: server-client: socket ready as server
///////////////////////////////
///  Module mode ready
///  waiting client at 10500
///////////////////////////////

となりちょっと変わる

client at 10500
とあるように
ポート 10500 を使うことになります

どちらも停止方法は
ctrl + c

これで辞書ファイルの結果を渡せるので
前回作成した辞書ファイルを
Rapiro のコマンドになるように編集

ちなみに Rapiro のコマンドは

http://wiki.rapiro.com/page/serial-command_ja/
にあるように
#M0
停止

#M1
前進

#M2
後退

#M3
右回り

#M4
左回り

#M5
両手をふる

#M6
右手をふる

#M7
両手を握る

#M8
右手をふる

#M9
右手を伸ばす

となっている

なので、これに対応するようにファイルを編集する

まず、バックアップをとっておく

cp rapiro.dic rapiro.dic_bak

これでいざというときにはこれから復旧できる

次にファイルの編集

sudo vim rapiro.dic

でファイルを開いて

<sil>   silB
<sil>   silE
<sp>    sp
ラピロ  r a p i r o
はっしん        h a q sh i N
こうたい        k o u t a i
バック          b a q k u
右              m i g i
左              h i d a r i
バンザイ        b a N z a i
たたかえ        t a t a k a e

の日本語部分を Rapiro のコマンドに変える

<sil>   silB
<sil>   silE
<sp>    sp
#M0  r a p i r o
#M1        h a q sh i N
#M2        k o u t a i
#M2        b a q k u
#M6        m i g i
#M8        h i d a r i
#M5        b a N z a i
#M9        t a t a k a e

これで保存

次に
制御コマンドを Julius から受け取り
GPIOのTXピンから
UARTシリアル通信でRapiro の基盤になっている
Ardunioに送信するプログラムを準備

これにより受け取った動作コマンドに応じて
サーボモータなどを動かす

vim rapiro_main.py

で python ファイルを作成

内容は

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import serial
 
host = 'localhost'
port = 10500
 
clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsock.connect((host, port))
com = serial.Serial('/dev/ttyAMA0', 57600, timeout=10)
 
while True:
        recv_data = clientsock.recv(512)
        com.write(recv_data)

次に必要なパッケージ
python-serial をインストール

sudo apt-get install python-serial 

これでようやく起動

julius -C rapiro.conf &

&をつけてバックグランド動作
これをつけないと端末入力できなくなる

途中で

///////////////////////////////
///  Module mode ready
///  waiting client at 10500
///////////////////////////////

がでたら Enter をおす

次に

sudo python rapiro_main.py

しかし、まったく動かない

原因を調べた結果、マイクの機種によってはうまく動作しないらしい

このため、そのような場合には
XMLパースが必要になる

RAPIRO(ラピロ)の音声制御(参考:日経Linux 2014 6月号)

にXMLパースのソースが載っていたので
これを使わせていただくことで無事に動作することができました

なお、参考にした書籍
ラズパイマガジンの読者限定ページで
この問題対応のソースも用意されているので
こちらで対処することも可能です

Rapiro の音声操作 その3

Rapiro の音声操作 その3

音声入力はできたけど
Julius で音声の認識から結果が表示されるまで
長い理由はJulius の初期設定の
辞書ファイルが大きいため

Juius の動作は
マイクから入力された音声を
辞書に登録されている単語と比較
そして
もっとも近い単語を選び出す
という処理になっている

そういえば音声で動く Android の音声関連も
どうなっているのか興味深いところ

それはさておき
この辞書ファイルに登録された単語の中から
最適な言葉を検索するため
活舌の曖昧な音声だったりすると
誤認識もするし
探すのに時間がかかる

Rapiro の動作に RaspberryPi だけでなく
ネットワークでサーバーで処理するとかできれば
もっとはやいのかもしれない

ただし、Julius ではそんなことをしなくても
音声認識させたい言葉だけを登録した
オリジナル辞書ファイルの作成が可能とのこと

つまり、必要最低限の単語だけ
登録した辞書ファイルをつくれば
音声認識のスピードアップ
そして認識精度の向上が可能

ただし、そのぶん反応する言葉は減る

用途ごとに絞るといいのかもしれない

なお、辞書ファイルとはいっても拡張子を
.dic という拡張子のファイルでつくるだけ

まずはログインして

cd dictation-kit-v4.3.1-linux/

で移動

次に

sudo vim rapiro.dic

で辞書ファイルを作成

内容は

<sil>   silB
<sil>   silE
<sp>    sp
ラピロ  r a p i r o
はっしん        h a q sh i N
こうたい        k o u t a i
バック          b a q k u
右              m i g i
左              h i d a r i
バンザイ        b a N z a i
たたかえ        t a t a k a e

左に認識させたい言葉

右に対応するモーションをローマ字で入力
入力するときの注意点としては
ナ行とかぶらないために
んのときには
N を大文字にすること

そして
っ を入れるときには q をつかうこと

m i g i
というように途中にスペースをいれること
くっつけて
mi gi
とするとエラーになるので注意

あと最終行に改行をいれないこと

これで辞書ファイルはできたので
次にこの作成した辞書ファイルを Julius に組み込む設定を行う

設定ファイルは .conf が拡張子の設定ファイルを作成する

sudo vim rapiro.conf

でファイルを作成

内容は

-w rapiro.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 800
-lv 1500
-demo

これで設定ファイルができたので

julius -C rapiro.conf 

を実行したらエラー

Stat: adin_alsa: device name from ALSADEV: "plughw:1,0"
Error: adin_alsa: cannot open PCM device "plughw:1,0" (No such file or directory)
failed to begin input stream

原因を考えたら
設定ファイルを書き換えたため
以前設定ファイルを変更したのが原因だった

vim  ~/.profile

でファイルを開いて

#export ALSADEV=plughw:1,0

というように
最下行をコメントアウトする
設定反映のため

sudo reboot

で再起動

これで再度

julius -C rapiro.conf

を実行すると

pass1_best: はっしん           
sentence1: はっしん
pass1_best: はっしん           
sentence1: はっしん
pass1_best: はっしん           
sentence1: はっしん
pass1_best: 右<input rejected by short input>
pass1_best: 左                    
sentence1: 左
pass1_best: 右                    
sentence1: 右
pass1_best: 左<input rejected by short input>
pass1_best: バック<input rejected by short input>
pass1_best: ラピロ<input rejected by short input>
pass1_best: 右<input rejected by short input>

というように指定した言語のみ反映されるようになる
ちなみに、途中で上とか下とか音声入力したけど
右とか左として認識された

終了は ctrl + c で終了

これで音声辞書作成と起動検証はできたので
次回は Julius のモジュールモードの起動

Rapiro の音声操作その2

Rapiro の音声操作その2

なんとかマイクで録音したものを再生することができたので続き

デフォルトが raspberryPI そのものだと
後々面倒なので、
USBのものを標準になるように設定ファイルを編集

ちなみに現在の優先順位を表示するなら

cat /proc/asound/modules 

この結果が

 0 snd_bcm2835
 1 snd_usb_audio

0がデフォルト設定扱いなので
USBのほうがデフォルトになるように設定する

 sudo vim /etc/modprobe.d/alsa-base.conf 

で編集

編集するときに
:set number
を使うと編集するときに便利

編集する場所は
17行めの

options snd-usb-audio index=-2

の部分
これを

options snd-usb-audio index=0

にして保存

設定反映のため再起動

sudo reboot

再度ログインして

cat /proc/asound/modules

を実行

 0 snd_usb_audio
 1 snd_bcm2835

というように
USBのほうが0に表示されていれば成功

次に音声認識エンジンの Julius
のインストール

もっと新しいバージョンがあるかもしれないけど
基本的に同じものが手に入るのなら
それを試したほうが無難
なぜなら、バージョンアップしたものを使うと
変更に対処しないとならなくなり
それができないと起動すらしないという結果になるため
ということで
4.3.1を使用

wget http://jaist.dl.sourceforge.jp/julius/60273/julius-4.3.1.tar.gz
wget http://jaist.dl.sourceforge.jp/julius/60416/dictation-kit-v4.3.1-linux.tgz

でファイルを取得

次に、インストールに必要になるパッケージをインストール

sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev 

必要なものがそろったので
julius のインストール

tar zxvf julius-4.3.1.tar.gz

で解凍

コンパイルとインストールだけど時間がかかる
私の環境では10分以上かかった

cd julius-4.3.1/
./configure -with-mictype=alsa
make
sudo make install

次に
ディクテーションキットの準備
ディクテーションキットは
聞き取った言葉をテキストにする部分のこと

これには日本語の音響モデルと言語モデルが含まれるので
これを追加する

まず圧縮ファイルを解凍し、移動する

tar zxvf dictation-kit-v4.3.1-linux.tgz
 cd dictation-kit-v4.3.1-linux/

次に Julius は使用するオーディオデバイスの指定が必要なため
export で指定する

export ALSADEV=plughw:0,0

次に julius の起動

julius -C main.jconf -C am-gmm.jconf -demo

これを実行すると

----------------------- System Information end -----------------------

Notice for feature extraction (01),
	*************************************************************
	* Cepstral mean normalization for real-time decoding:       *
	* NOTICE: The first input may not be recognized, since      *
	*         no initial mean is available on startup.          *
	*************************************************************

Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:0,0": Device [USB PnP Sound Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>

という画面がでてくるので
この状態になったら
マイクで喋るとその音声をテキスト表示してくれる

しかしあまり正確ではないので
早口で喋ったりすると誤変換される
今回の結果だと

STAT: AD-in thread created
pass1_best:  わい て き           
sentence1:  満鉄 。 
<input rejected by short input>
pass1_best:  もう 著 、           
sentence1:  もう ちょっと 。
pass1_best:  そう<input rejected by short input>
pass1_best:  ちょっと 、           
sentence1:  ちょっと 。
pass1_best:  いや 場合              
sentence1:  いや 場合 。
pass1_best:  微妙 。                 
sentence1:  微妙 。
pass1_best:  こんにちは 。           
sentence1:  こんにちは 。
pass1_best:  全身<input rejected by short input>
pass1_best:  知事 が 、                
sentence1:  血 じゃ ない 。
<<< please speak >>>

というように
変な言葉になってしまった

中断するには ctrl + c で終了できる

なお、このままだとログインするたびに
export コマンドが必要なので
面倒なら

vim .profile

でファイルを開き
最終行に

export ALSADEV=plughw:1,0

を追加

設定を反映するために

source .profile

を実行

これで

 printenv | grep ALSA

で結果が

ALSADEV=plughw:1,0

となっていればOK

続きは次回

rapiro の音声制御その1

rapiro の音声制御その1

使用するのは RaspberryPi type
type B+ だと Rapiro をちょっと改造する必要があるので
面倒なら type B のほうがおすすめ

なお、Rapiro の頭部に入れるので、ケースは不要

そして Rapiro

Rapiro に関しては電池よりもACアダプタを使ったほうが楽
これはスイッチサイエンスで購入可能
ACアダプター 6V/3.8A(ACコード付)

まず
USBオーディオデバイスの音響4
を差し込む

これを使い、マイク入力ができるようにする

マイクについてはiBuffalo のマイクを利用

差し込んだら
lsusb コマンドで利用可能なのかを確認

lsusbの実行結果は

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 005: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]

結果の中の

Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller

がUSBオーディオ

そして

Bus 001 Device 005: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]

が無線LANのアダプター

次にオーディオデバイスの認識を調べたいので

arecord -l

を実行

結果は

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

で認識もOK
なお、録音にはデバイスを指定する必要があるので
これをやらないと後で困りそう

次に録音
これは arecord コマンドを使う

実行するときに
hw:1,0
をつけるとうまくいかないみたいなので

arecord -D plughw:1,0 -f S16_LE -r 16000 test.wav

を実行

すると録音が開始される

なお録音の中止は
ctrl + c
で修了

とりあえずテストなので
石焼き芋うま
というかんじで適当でOK

これを再生する

aplay test.wav 

しかし、機械のような音しか聞こえないので

音量の調整をすることに

まずはオーディオデバイスの有線順位を確認

cat /proc/asound/modules 

実行結果は

 0 snd_bcm2835
 1 snd_usb_audio

なので、これを元に調整

amixer コマンドで
-c オプションサウンドカードの番号が必要なので
今回調べた番号を使う

amixer -c 1 sset 'Mic'10%

これで再度録音

結局のところ、イヤホンがうまくはまっていなかっただけみたいだった

あと、デフォルトだとUSBではなく
Raspberry PI 本体のステレオミニジャックになるので
USBで再生するのなら

 aplay -D plughw:1,0 test.wav

となる

次回、音の標準出力先を変更予定

Rapiro を raspberry Pi から操作

Rapiro を raspberry Pi から操作

まず raspberryPi に ssh でログイン

次に

sudo apt-get install cu


cu
をインストール

 cu -s 57600 -l /dev/ttyAMA0


cu コマンドでb Ardunio へ接続

あとは
#M0 停止
#M1 前進
#M2 後退
#M3 右に曲がる
#M4 左に曲がる
#M5 両手を振る
#M6 右手を振る
#M7 両手を握る
#M8 左手を振る
#M9 右手を伸ばす

を実行することで操作することができます

この操作モードからは
Enter
~
.
と順番に押すことででれますが
RaspberryPi からもログアウトしてしまいます

ちなみに、 ardunio で操作するときには
管理者権限で起動しないと
シリアルポートの変更ができないので注意が必要です

なお検索して参考にさせていただいた
http://onoono-life.blogspot.jp/2014/03/rapiro.html
にあった
/boot/cmdline.txt の編集は行わずに実行することができました

おそらく、他のパッケージなどでシリアルポートを使えるようにしたのが理由と思われます

Rapiro でライブ映像の配信

Rapiro でライブ映像の配信

RAPIROの視点を楽しむ 〜カメラでいろいろ遊ぶ②〜

を参考に実践

今後、いろいろな機能をつけたときに使えそうな予感

Ustream みたいに世界中に配信するのではなく
ローカルで使う予定なので
これは使えそう

この機能に必要なのが
MPEG-streamer

sudo apt-get install subversion libjpeg-dev imagemagick

でバージョン管理ソフト subversion を入れている

次に subversion を使い
MPEG-streamer を取得

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして make でコンパイルして
make install でインストールする

cd mjpg-streamer
make
sudo make install 

これでインストール完了

これからやるほうほうだと
定期的に撮影した写真を連続で送りつづける
というものになるらしい

なので、これに使う一時保存フォルダを作成

mkdir /tmp/stream

次に raspstill で定期的に写真を撮影し
mjpg-stream で配信開始となる

次にスクリプトで配信開始する

vim stream_start.sh

でファイルを作り

#!/bin/sh
raspistill -w 640 -h 480 -rot 180 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /usr/local/www -p 8080" &

が内容になる

raspistill -w 640 -h 480 -rot 180 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &

で写真撮影
-rot 180
で写真を反対にして rapiro に合わせている
これをやらないと逆さになる

-q 5
でpjeg のクオリティを0~100のうち
5にしてファイルを軽くしている

-o /tmp/stream/pic.jpg
はファイルの出力先

-tl 100
で撮影間隔を指定
これはミリ秒
つまり 100 ミリ秒間隔で撮影
これだとフレームレートが 10fps になる

-t 9999999
は撮影時間の指定
これはそこまで撮影しなくて途中で修了してもOK
最大時間と考えるといいかも

-th 0:0:0
はサムネイルに燗する設定だけど
今回はなしでやるので 0:0:0

&をつけるのは linux おなじみのバックグランド動作

2行めの
export LD_LIBRARY_PATH=/usr/local/lib
はライブラリのパスの指定
これが MJPG-streamer の共有ライブラリへの参照設定

これをしないと mjpg_streamer が使えない

そして

mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /usr/local/www -p 8080" &

が実際に配信開始するところ

-i “input_file.so -f /tmp/stream”

/tmp/stream
の中の画像が更新されるたびに配信する仕組み
らしい

-o “output_http.so -w /usr/local/www -p 8080”
は配信の出力先
今回なら webサーバーのIPアドレスになる
そして
-p 8080
なので
8080ポートを使う

次に停止するスクリプトも作っておく

vim stream_stop.sh

これは killall コマンドで動作を停止する

この killall コマンドはプロセス修了につかう

を参考にするとわかりやすい

今回、バックグランドで動いている
撮影のための raspistill
配信のための mjpg_streamer
を停止したいので

killall raspistill
killall mjpg_streamer

となる

これでみれるかをテストするので
まずはスクリプトに実行権限を付与する

chmod 755 stream_start.sh
chmod 755 stream_stop.sh

これで

./stream_start.sh

で実行

そして
サーバーIP:8080
でアクセスするとカメラ画像をみることができます

Stream のところで動画をみることができます

stream

ただし、負荷がかかり過ぎるとダウンします

電源が落とした場合
/tmp 以下が消えていたので

再度

mkdir /tmp/stream

で一時保存ディレクトリを作成

これをやらないとエラー

なお、この状態だと
誰でも見れるという状態なので
パスワードつきで配信をするのなら

オプションを追加して
-c ユーザ名:パスワード
とします

もし
ユーザ名 pi
パスワード raspberry
とするなら

export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /usr/local/www -p 8080 -c pi:raspberry"&

というようにすれば
パスワードつきで配信可能になります

stream2

もし今後公開するなどしてメンテする必要があるのなら
変数にするとより使いやすくなります
例えば
ポート
ユーザ名
パスワードを変数にすると

#!/bin/sh

PORT="8080"
ID="pi"
PW="raspberry"


raspistill -w 640 -h 480 -rot 180 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"&

というようにしても同じように動きます

なお、Ustream などのネットへ公開するには
mmfpeg を使用

インストール方法は

sudo apt-get install ffmpeg

個人的には Ustream の無料枠だと制限がつくので
Linux でストリーミングサーバーを構築してみようと思います

rapiro へサーバ機能を加える

rapiro へサーバ機能を加える

今回は
RAPIROをWiiリモコンで制御する

を参考に実践
とりあえず bluetooth 関連は予算越えるため
機会をみて今後行うことに

まず RaspberryPi を載せたRapiro を起動する

次に ssh でログイン
今回は無線LAN経由でログイン

ssh pi@192.168.10.132

次に
RaspberryPI で Samba を設置して
GUIでファイルのやりとりをできるようにする

sudo apt-get -y install samba
sudo apt-get -y install samba-common-bin

ファイルを編集する前にバックアップ作製

cd /etc/samba/
sudo cp smb.conf smb.conf_bak

そしてファイル編集

sudo vim /etc/samba/smb.conf

でファイルを開いて
shift + g で最終行へ移動

[pi]
comment = pi's home
path = home/pi
public = Yes
read only = No
writable = Yes
quest ok = Yes
force user = pi
directory mode = 0777
create mode = 0666

を追記

sudo smbpasswd -a pi

でパスワードを設定

一度入力すると確認のため
Retype new SMB password:
となり、もう一回入力する
あとは samba を再起動して設定を反映する

 sudo service samba restart

これでファイルのやりとりが楽になるはず

次に カメラ関連
まず写真保存用のディレクトリを作製

mkdir Photo

次に

raspistill -w 640 -h 480 -rot 180 -o Photo/image.jpg -n -t 10

で撮影テスト
エラーがでなければ撮影成功

-w 640 -h 480
は幅と高さの設定
これをやらないと
2592×1944
という巨大サイズになる

-rot 180
は画面を180度回転
理由は rapiro に設置するときに反対に設置するから

-o Photo/image.jpg
は出力するファイルパス

-n はプレビューなし

-t 10
で待ち時間
これはミリ秒で設定なので
10ミリ秒したら撮影

これで撮影した画像をみるには
samba からアクセスするか
SFTPでダウンロードしてみることができる

でもDLNAサーバーを入れれば
スマホやタブレットアプリで見れる

まずはc DLNAサーバインストール

sudo apt-get install minidlna

次にフォルダ設定
編集する前に

cd /etc/
sudo cp minidlna.conf minidlna.conf_bak
cd -

でバックアップしておく

sudo vim /etc/minidlna.conf

で設定ファイルを編集

26行めの
media_dir=/var/lib/minidlna
をコメントアウトして

#media_dir=/var/lib/minidlna
media_dir=V, /home/pi/Video
media_dir=A, /home/pi/Music
media_dir=P, /home/pi/Photo

と変えて保存

次に
それぞれ対応するディレクトリを作製しておく

 mkdir Music
mkdir Video

設定が終わったので

sudo /etc/init.d/minidlna start

で MiniDLNAサーバーを起動する

また、毎回起動は面倒なので

sudo update-rc.d minidlna defaults

でDLNAサーバーを自動起動するようにしておく

これは centos とかの chkconfig 設定と似ている

次にお手軽に見れるように
Nexus7 には
MediaHouseのUPnP / DLNA対応ブラウザ

ipod touch には
media:connect
をインストール

しかし、なぜかどちらも撮影した画像が表示されない

設定ファイルを書き換えているので
設定ファイルの読み込みを実行

sudo /etc/init.d/minidlna force-reload
sudo /etc/init.d/minidlna restart

その後、表示されたので
もしかしたら DLNAに反映されるまで時間がかかるのかもしれない

このあたりを調べてみたら
どうやら自動更新されないときがあるらしく
この場合、手動で更新するか
自動更新するように設定が必要

sudo vim /etc/minidlna.conf

で設定ファイルを編集する

79行めの

#inotify=yes

inotify=yes

へ変更

94行めの

#notify_interval=895

notify_interval=895

に変更して保存

設定ファイルを書き換えているので
設定ファイルの読み込みを実行

sudo /etc/init.d/minidlna force-reload

これで自動更新されるようになる

次に動画を撮影

raspivid -w 640 -h 480 -rot 180 -o Video/sample_movie.h264 -n -t 10000

でも.h264のファイルは発見してくれない
ということなので mp4 へ変換する

sudo apt-get update
 sudo apt-get install gpac

これで必要なソフトが入ったので

MP4Box -add Video/sample_movie.h264 Video/sample_movie.mp4

で変換

しかし、なぜか今度は サーバーが発見できないので

sudo /etc/init.d/minidlna restart

で再起動

すると変換した動画をみることができた