夢に向かって、好奇心を持ち、疑問を持ち続ける。それが努力。

趣味でロボット職人を目指す自称AI研究者のメモです。

Matlab:配列を作ってデータを順次格納する

実はMatlabPythonみたいにできるんです.
しかも,サイズを予め指定してなくても(!)というのがすごいところ.

> a = []
> a(1) = 6
> a(2) = 4
> a

a = [6, 4]

上記の場合には,配列なのでデータに数字しか入らないけど,
以下のようにすればオブジェクトを格納できる.

> b = {}
> b{1} = object1
> b{2} = object2

上記の場合に,参照するときのカッコの形がかわらないのが少し違和感ありますが,
順次入ってくるデータを扱う時には便利なのでメモメモ.

Python:csvファイルの入出力

カンマ","で区切られたテキストファイルを読み込むとき,
中身が数字列だとnumpyも使えますが,少し遅いので,
csvreader,csvwriterが便利です.

1.読み込むとき

import csv

file = open(filepath_str, 'r') # codecsで文字コード指定読み込みも可
csvdata = csv.reader(file)
for row in csvdata:
print row
file.close()


2.書き込むとき

import csv

file = open(filepath_str, 'r') # codecsで文字コード指定読み込みも可

transdata = []
for row in csvdata:
transdata.append(row)

writer = csv.writer(file,lineterminator='\n')
writer.writerows(transdata)

# writer.writerow(row)とすれば1行ずつ出力可能


その他にも,numpy,pandasを使う方法がありますが,
今回はここまで.

Python:改行なしで文字列標準出力

久しぶりですが,最近コード書きに集中してるのですが,良く忘れるのでコーディングのメモを書いておきます.

for文の中がどれくらい進んでるかゲージで表したい時,
以下のように,stdoutを使うと便利です.

import sys
for data in dataset:
sys.stdout.write(".")

print文を使うと,改行されてしまうので,データ量が多いときには,
上記が便利です.

但し,標準出力されるまでにリアルタイムでない(キャッシュがたまったらFLUSHされるような感じ)ので,リアルタイムに…というと難しいですが.

Tera TermのログにTimeStampを出力する方法

今回はWindowsでシリアル通信を行うときに良く用いられるTera Termのログ出力及び,タイムスタンプの出力方法についてです.

Tera Termは, SourceForgeからダウンロードできます.
http://sourceforge.jp/projects/ttssh2/

シリアル通信を行っていて,応答までの時間を測定したいこともあると思います.そんなとき,マクロを組んでも良いですが,ログ出力でタイムスタンプ機能がついているので,紹介します.

まず,以下の設定ファイルを次のように書き換えます.
C:\Program Files\teraterm\TERATERM.INI

ーーーーーーーーーーーーーーーーーーーーー
; timestamp flag for Log (on/off)
(変更前) LogTimestamp=off

(変更後) LogTimestamp=on
ーーーーーーーーーーーーーーーーーーーーー

次に,Tera TermでCOMxとの接続を実施後,ファイル→ログボタンを押下後,出力先ファイルを選択すると,転送用ログファイルにログがどんどん溜められて行きます.

実行していくと溜められていくログは,ログ表示で途中で見ることも出来ますが,最終的には,接続断した際に全てのログがファイルに転送され(書き込まれ)ます.

これにより,出力先のログファイルに,
[timestamp] 入出力
の形式で出力されます.

注意は,最初に,【ログ】ボタンを推しておくことです.
これをしないと,データは保存されませんので,お気をつけてください.

不安になったら,途中で【ログ表示】ボタンを押して,ちゃんとログが蓄積されているかを確認すると良いと思います.


今日はTera Termのログ出力方法に関してでした!

PILを使って画像の各ピクセルの色を取得する

Macを使ってPython Image Library(PIL)をインストールし,画像の各ピクセルのRGB値を取得する手法を紹介します.

1.まずPILをインストールする
 jpeg画像を用いる場合には,jpeg decoderのインストールが必要なので,注意.

 http://www.ijg.org/files/jpegsrc.v8c.tar.gzをダウンロードして解凍.
 解凍ディレクトリに移動し,下記を実行.

 $ ./configure
 $ make
 $ sudo make install

 その後,pilをインストール.

 $ sudo pip install pil

 以上で,PILのインストールは完了.


2.次に,PILを使ってRGB値を取得してみます.

 サンプルコードは下記の通り.

import Image

img = Image.open("test.jpeg")
img.convert("RGB")

pixelSizeTuple = img.size

rlist = []
glist = []
blist = []

for i in range(pixelSizeTuple[0]):
	for j in range(pixelSizeTuple[1]):
		r,g,b = img.getpixel((i,j))
		rlist.append(r)
		glist.append(g)
		blist.append(b)

f = open('output.csv', 'w')
f.write("r,g,b\n")
n = len(rlist)
for i in range(0,n-1):
    f.write(str(rlist[i]) +"," + str(glist[i])  +"," + str(blist[i]) +"\n")

f.close()

こんなコードを書けば,output.csvファイルの各列にRGB値を出力できます.


ちなみに,最初はPILインストールしただけだったので,
decoder jpeg not available というエラーでつまったんですが,
下記のサイトを参考に,再インストールしたらできました.

http://kwmt27.net/index.php/2013/07/14/python-pil-error-decoder-jpeg-not-available/

Linuxのkernelとdistribution

Linux使ってはいたけど,実はあいまいに理解していた部分がたくさんあった…ってことで整理してみた.

Linuxには,UNIXのOSのことだと思ってたけど実は違った.

Linuxは実際には,OSの土台であるカーネルの部分だけ.ディスクやメモリなどの資源の管理や,割り込み処理,プロセス通信などのOSとしての基本機能のみ提供している.
ここに,ソフトウェアプログラムをインストールすれば,完全なUNIXライクなシステムを構築できるとのこと.

ただ,自分でソースコードからシステムを構築するのは大変なので,カーネルとOSの基本機能以外の機能も持ったソフトウェアがセットになった,distributionというのが提供されており,これを使ってシステムを容易に作ることができる.

図は参考までに書いてみた.

f:id:robomixcom:20140902113210p:plain

以上.
ただ使えるだけじゃなく,【理解して使える】ことが大事だと思いました.

macで音声認識ソフトJuliusを使ってみる

mac音声認識ソフトJuliusを使ってみたのですが、ちょっとひっかかった点があるので紹介。

参考にさせて頂いたサイト:
http://qiita.com/ikesato/items/ffe1eff8440a995065fe


手順は次の通り。

1.Juliusに対してマイク入力を行うのに必要なportaudioをインストール
2.Juliusをインストール
3.Dictation-kitをインストール
4.細かい調整をして実行

順に説明して行きます。

1.portaudio のインストール

http://www.portaudio.com/download.html から 最新のstableバージョンをダウンロードする。(本開発時の最新バージョンはpa_stable_v19_20140130.tgz)

下記の手順でビルド。

% tar -xzf ~/Downloads/pa_stable_v19_20140130.tgz
% cd portaudio
% env CFLAGS='-arch i386' LDFLAGS='-arch i386' ./configure --disable-mac-universal

Makefile の編集。

CFLAGS から -Werror を削除

include/pa_mac_core.h の編集

(削除) #include <AudioUnit/AudioUnit.h>
(削除) #include <AudioToolbox/AudioToolbox.h>
(追加) #include <CoreAudio/CoreAudio.h>

編集が完了したらビルド。

% make
% sudo make install

これでportaudioのインストールは完了。

2.Juliusをインストール

http://julius.sourceforge.jp/index.php?q=newjulius.html
アーカイブのところから最新のjulius-*.*.*.tar.gzをダウンロード。(本開発時の最新バージョンはjulius-4.3.1.tar.gz)

% tar -xzf ulius-4.3.1.tar.gz
% cd julius-4.3.1
% env CFLAGS='-O3 -arch i386' LDFLAGS='-arch i386' ./configure --enable-words-int --with-mictype=portaudio
% make
% sudo make install

これでJuliusのインストールは完了。

3.Dictation-kitをインストール

http://julius.sourceforge.jp/index.php?q=dictation-kit.html
から最新のディクテーションキットをダウンロード。(本開発時の最新バージョンはdictation-kit-v4.3.1-osx.tar.gz)

% tar -xzf dictation-kit-v4.3.1osx.tar.gz

Dictation-kitのインストールは展開するだけ。


===== 以下余談 =====
ここで本当はすぐに実行できるはずだが・・・

/run-gmm.sh を実行しても次のようなエラー発生。

dyld: Library not loaded: /usr/local/lib/libportaudio.2.dylib
Referenced from: dictation-kit-v4.3.1-osx/bin/julius

どうやらjuliusから参照されているlibportaudioのライブラリがないとのこと。

Makefileにもそんな指定する場所はないし、juliusファイル自体は実行ファイルで中身が見れないのでどうしたもんだと思ったところ・・・

2でインストールしたjulius中にも同様のjulius実行ファイルを発見。

これと、dictation-kit-v4.3.1-osx/bin/juliusを入れ替えた(正確にはdictation-kit-v4.3.1-osx/bin/juliusを削除して、julius-4.3.1/julius/juliusをコピーしてきた)ら、正常に動いた。

(なぜかわからないけど、動いたからよかったことにする)

この余談部分を飛ばしても良いように、下記4番に改めて記載しておく。
==== 余談終了 =====

4.細かい調整をして実行

dictation-kit内のjuliusをそのまま使うと、なぜかjuliusが指定しているportaudioのライブラリが見つからない(実際にないので)エラーが発生するので、下記のような調整をする。

rmv dictation-kit-v4.3.1-osx/bin/julius
cp julius-4.3.1/julius/julius dictation-kit-v4.3.1-osx/bin/

すなわち、dictation-kit-v4.3.1-osx/bin/juliusを削除して、julius-4.3.1/julius/juliusをコピーする。

これで、実行できるようになった。最後は Dictationの中にあるHOWTOファイルの通りに実行。

cd dictation-kit-v4.3.1-osx
./run-gmm.sh

少し待って<<< please speak >>> が現れたら、マイクに向かって話しかけると認識結果を返してくれる。


これで一応使えるようになりました。

最初は1-best(認識結果のうちで最も発話されたものに近いとされる最上位)のみしか表示されていないが、n-bestの数値変更等も可能なので、ちょっといじってみたいと思う。


以上、最近話題のロボットで大事な機能である、人の言葉を理解する部分の紹介でした。


googleさん音声認識、ドコモさんの音声認識AppleのSiriさんなど賢い音声認識機がたくさん出てるので、自分で作るのは今更感はありますが、ちょっと自分で遊んでみる分にはこれでも十分だと思う。(Julius自体は前から公開されてたけど、辞書は今もしっかりメンテナンス、アップデートが行われているようなので)


動くものって楽しいなって思う今日この頃の星の妖精さんの日記、そろそろ重い腰を上げてロボット制作にくり出したいと思います。