福野泰介の一日一創 - create every day

声だけでプログラミング! 耳がついたスマートIchigoJamの作り方

2018/03/21
#IchigoJam #KidsIT #AI #python 

日本語を(一部)理解する、スマートIchigoJamができました。声でプログラミング!

IchigoJamの基本的な単語(コマンド)と数を聞き分け、代わりにキーボードを打ってくれます。
(正確にはシリアルでIchigoJamへ送っています)


「LEDつけて」と呼びかけても、耳がついてないIchigoJamはやってくれないよ。
と、IchigoJamプログラミング体験の時に紹介しますが、「耳」とそれを聞き分ける「機能」をつければOKです!

スマートIchigoJamの作り方 (for Mac)
オープンソースでフリーな日本語音声認識「Julius」(ジュリアス)を準備する
オフラインでフリーで使える音声認識 Julius、声で操作するロボを自作しよう

認識する辞書をつくる

cat > test.yomi % ACTION 1 いち 2 に 3 さん 4 よん 5 ご 6 ろく 7 なな 7 しち 8 はち 9 きゅう 9 く 10 じゅう LED1 えるいーでぃーつけて LED0 えるいーでぃーけして WAIT60 まって GOTO1 いちえいって RUN らん LIST りすと ESC とめて ENTER えんたー % NS_B [s] silB % NS_E [s] silE

文法をつくる

cat > test.grammar S : NS_B TARGET ACTION NS_E S : NS_B TARGET WO ACTION NS_E

Julius用に変換

iconv -f utf-8 -t eucjp test.yomi | yomi2voca.pl | iconv -f eucjp -t utf-8 > test.voca perl ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/mkdfa.pl test

Juliusをモジュールモードで起動

julius -C ~/sandbox/julius-kits/grammar-kit-4.3.1/hmm_mono.jconf -input mic -gram test -module

Python3で認識したコードをIchigoJamに送る言葉に変換するプログラムをつくる
(XMLパースにElementTree、シリアル接続にpyserialを使用)

cat > julius-client-ichigojam.py #!/usr/bin/env python3 import xml.etree.ElementTree as ET import socket import serial ser = serial.Serial("/dev/tty.SLAB_USBtoUART", 115200, dsrdtr=True) def recog(words): s = "" for w in words: s += w print(s) if s == "1": ser.write(b"1 ") elif s == "2": ser.write(b"2 ") elif s == "3": ser.write(b"3 ") elif s == "4": ser.write(b"4 ") elif s == "5": ser.write(b"5 ") elif s == "LED1": ser.write(b"LED1\n") elif s == "LED0": ser.write(b"LED0\n") elif s == "WAIT60": ser.write(b"WAIT60\n") elif s == "GOTO1": ser.write(b"GOTO1\n") elif s == "RUN": ser.write(b"RUN\n") elif s == "LIST": ser.write(b"LIST\n") elif s == "ESC": ser.write(b"\x1b") elif s == "ENTER": ser.write(b"\x10") client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 10500)) sockfile = client.makefile() data = "" while 1: line = sockfile.readline() if line != ".\n": data += line else: root = ET.fromstring(data) data = "" if root.tag == "RECOGOUT": words = [] for wordtag in root.iter("WHYPO"): words.append(wordtag.attrib["WORD"]) words.pop(0) words.pop() recog(words)

実行!音声コントロールIchigoJamのできあがり!

python3 julius-client-ichigojam.py

pyserialがなければ、pipでインストール(USBシリアルは環境に合わせて書き換えてください)

pip install pyserial

自分なりの「スマート」をプログラミングしちゃいましょう!
ネットワークが不要なので、ラズパイゼロなどに入れて、コンパクトに動かす音声認識モジュールにすると良さそうです。

links
- オフラインでフリーで使える音声認識 Julius、声で操作するロボを自作しよう

オフラインでフリーで使える音声認識 Julius、声で操作するロボを自作しよう

2018/03/19
#megane #AI #python 

APIを使った音声認識の精度はなかなか高いのですが、ネット接続が必須なので電力的やコスト的にまだ合わない場面多々。

そこで、Interface 2018.4号で発見、オフラインかつフリーで使える音声認識エンジン「Julius
読みは、ジュリアス、でした、ユリウスではなく(Thanks < 青木さん

事前に音声調整をすることなく使え、認識精度もそこそこいい感じ。辞書を自分で作って、その中から認識させることができて使い勝手良し。 ラズパイ0や小型でオフラインのA+などにいれて、IchigoJam連携するモジュールにするのにもいい感じそう!


「テレビ付けて」を認識した様子 on Mac

Juliusのインストールから、独自語彙認識させるまでのメモ (for Mac)
インストール

git clone https://github.com/julius-speech/julius.git cd julius ./configure --enable-words-int make sudo make install cd ~ mkdir -p sandbox/julius-kits cd sandbox/julius-kits wget -O dictation-kit-v4.3.1.tar.gz https://github.com/julius-speech/dictation-kit/archive/dictation-kit-v4.3.1.tar.gz wget -O grammar-kit-4.3.1.tar.gz https://github.com/julius-speech/grammar-kit/archive/v4.3.1.tar.gz tar xvf dictation-kit-v4.3.1.tar.gz tar xvf grammar-kit-4.3.1.tar.gz mv dictation-kit-dictation-kit-v4.3.1 dictation-kit-v4.3.1 cd ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/ ln -s `which mkfa` ln -s `which dfa_minimize`

独自語彙設定

mkdir -p ~/sandbox/test cd ~sand/box/test cat > test.yomi % TARGET IchigoJam いちごじゃむ テレビ てれび アンプ あんぷ ウーハー うーはー LED えるいーでぃー % ACTION つけて つけて 消して けして ON おん OFF おふ % WO を お % NS_B [s] silB % NS_E [s] silE

独自文法設定

cat > test.grammar S : NS_B TARGET ACTION NS_E S : NS_B TARGET WO ACTION NS_E

独自語彙をJulius用に変換しておく

iconv -f utf-8 -t eucjp test.yomi | yomi2voca.pl | iconv -f eucjp -t utf-8 > test.voca perl ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/mkdfa.pl test

独自語彙を設定して、音声認識エンジンを動かすスクリプト

cat > julius-server.sh julius -C ~/sandbox/julius-kits/grammar-kit-4.3.1/hmm_mono.jconf -input mic -gram test -module &

音声認識エンジンに接続して、認識したコマンドを受け取るスクリプト(Python3)

cat > julius-client.py #!/usr/bin/env python3 import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 10500)) sockfile = client.makefile() while 1: line = sockfile.readline() print(line)

試しに、音声認識エンジンを動かし、認識させてみる

sh julius-server.sh python3 julius-client.py

client.sendで、認識を一時中止したり、認識語彙を切り替えてYES/NOのみを待ったりといろいろできて、便利そう!
モジュールモードについて - Julius

links
- 声だけでプログラミング! 耳がついたスマートIchigoJamの作り方

続く福井の大雪警報、オープンデータ消火栓探しと警報取得Python3プログラム with SPARQL API

2018/02/06
#SPARQL #python #opendata 

消火栓がすっぽり埋まってしまうほどの大雪に見舞われた福井県。
大雪警報は継続中です。
大雪に伴う市民生活情報 – めがねのまちさばえ 鯖江市


左:完全に埋まった消火栓、右:消火栓救出成功!

火事から守る命綱、消火栓も合わせて除雪しておきましょう。

消火栓を探す - findhydrant
金沢では金属探知機で消火栓を探していたそうですが、緯度経度データ付きの消火栓オープンデータで市民の力で防災対策が可能です。 odp / オープンデータプラットフォームの消火栓テンプレートで登録すれば、すぐにこのアプリに反映されます!
金属探知機で消火栓探し除雪 金沢市消防局 | NHKニュース

警報チェックにオープンデータを活用します。
気象庁による配信されているオープンデータが、AITCによってSPARQL APIで取得できるようになっていました。
先端IT活用推進コンソーシアム - 公開API

福井県の警報・注意報のデータがあるURLを取得するSPARQLクエリーがこちら

select * { <urn:uuid:f57b5866-0c8c-3c92-9aff-10a715cdf48b> atom:entry ?o. ?o atom:updated ?updated. ?o atom:content ?content. ?o atom:link ?link. ?o atom:title ?title. FILTER(REGEX(?content, "福井")) FILTER(REGEX(?title, "気象特別警報・警報・注意報")) } order by desc(?updated) limit 1

これを使って、市町村毎の警報、注意報を取得するPython3のプログラムを作ってみました。

import urllib.request import urllib.parse import xml.etree.ElementTree as ET import dateutil.parser import sys if len(sys.argv) == 1: print("getalerm.py [pref] [city]") print("ex) python3 getalerm.py 福井 鯖江市") print() pref="福井" city="鯖江市" else: pref=sys.argv[1] city=sys.argv[2] query = ( 'PREFIX atom: <http://www.w3.org/2005/Atom#>\n' 'select * {\n' ' <urn:uuid:f57b5866-0c8c-3c92-9aff-10a715cdf48b> atom:entry ?o.\n' ' ?o atom:updated ?updated.\n' ' ?o atom:content ?content.\n' ' ?o atom:link ?link.\n' ' ?o atom:title ?title.\n' ' FILTER(REGEX(?content, "' + pref + '"))\n' ' FILTER(REGEX(?title, "気象特別警報・警報・注意報"))\n' '} order by desc(?updated) limit 1\n' ) print(query) url = "http://api.aitc.jp/ds/sparql?query=" + urllib.parse.quote(query) + "&output=xml" #print(url) resfn, headers = urllib.request.urlretrieve(url) #resfn = "/var/folders/0p/8n831_gn5j97jrlqmh5ddggc2s2n0c/T/tmpaqzg7_ib" print("sparql result file: " + resfn) tree = ET.parse(resfn) root = tree.getroot() xmlurl = tree.find(".//{http://www.w3.org/2005/sparql-results#}binding[@name='link']")[0].text updated = tree.find(".//{http://www.w3.org/2005/sparql-results#}binding[@name='updated']")[0].text supdated = dateutil.parser.parse(updated).astimezone().strftime("%Y/%m/%d %H:%M:%S") # xmlfn = "4848abcd-56a2-3170-8468-4fef8be3d405.xml" xmlfn, headers = urllib.request.urlretrieve(xmlurl) print("xml file: " + xmlfn) print("updated: " + supdated) tree = ET.parse(xmlfn) root = tree.getroot() warn = root.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Warning[@type='気象警報・注意報(市町村等)']") for item in warn: area = item.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Area") name = area.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Name").text # print(name) if name == city: for kind in item: if kind.tag == "{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Kind": alert = kind.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Name").text print(alert)

SPARQLクエリーの渡し方、ネームスペース付きXMLのパース、日付の日本時間変更などやってます

備えあれば憂い無し。災害は忘れた頃にやってくる。
痛い目に遭った今こそ、次に向けた手を創っておきましょう!

links
- 気象庁防災情報XMLフォーマット | 技術資料
- 大雪に伴う市民生活情報 – めがねのまちさばえ 鯖江市
- odp / オープンデータプラットフォーム

音声認識AI窓口、AI移動支援のプロトタイピングと筋ジストロフィー - 障がい者に寄り添うハッカソン

2018/01/14
#sabae #codefor #opendata #maker #python #AI 

鯖江市の第4次障がい者計画「あるがままに 自分らしく いきいきと ともに暮らせる まちづくり」
障害の理解と、課題に対するアイデアソン、ハッカソンなど、継続的なものづくりがポイントです。

Code for Fuchu連携で、COTTONさくらんぼの岩間由里子さんからも情報提供。 筋ジストロフィーで手足に障害があり、2cm四方を範囲としたスライドと押し込み動作だけで使えるスマホを熱望。オープンデータ化と、使う人に合わせたアプリの横展開、必須ですね!

実際に、指一本でスマホ操作にチャレンジしましたが、指を画面から離せないという条件は厳しく、通常操作が無理でした。 調べるとiPhoneの3Dタッチなど、タッチパネルの力のかけ具合は、mouseforce系のAPIをブラウザ上で取得もできるので、いろいろ実験してみたいと思います。
iOS9で追加されたForceTouch(3DTouch)をJavaScriptで操作してみる | WebDesign Dackel
また、日本筋ジストロフィー協会でも「ワンキーマウス試作報告」の事例が掲載されていました。


主催、Code for Japan コーポレートフェローシップ、鯖江市臨時職員三ツ山さん(富士通)

アイマスクをつけてアイデアソン。
目に優しく、耳が研ぎ澄まされ、隣のテーブルの会話もよく聞こえちゃいます。
声でジャンケンして、ファシリテーターを決め、アイデアのディスカッションスタート。 まとめるための紙が使えない点が心配でしたが、みんな条件が同じなので、ひとつひとつ整理して進める意識を共有できて意外といい感じです。

つづいて、障害体験。高齢者シミュレーショングッズを借りて、重りをつけたり、膝の動きを制限する器具を付けて歩き回ってみます。 普段の何でもない生活の難易度がアップするので、刺激が欲しい人にもオススメです!

制限された視野をシミュレートするメガネ。

アイマスクをして、杖をもって点字ブロックを辿るチャレンジ。
センサーやGPSをつけた、IoT白杖をお互いつくって、難易度高いコースで対戦などできると楽しそう。

「Webアプリはじめのいっぽ」でHTMLの基本を覚えて、ハッカソンタイム!

WebRTCを使って、世界中どこからでもサポートできる!(featuring SkyWay
スカイボイス

アイマスクとスマホを装備をして自販機での買い物チャレンジ!

先のアイデアソンで登場した「おたすけパンダ」と「Pくん」の実現、AIチャットによる市役所窓口デモ。
おたすけパンダPくん

鯖江市も公開した、給付金オープンデータによる質問応答機能のデモに加え、音声認識と音声合成を使った窓口も実験。

Google Cloud Speech APIを使うと、高精度な音声認識が簡単に実現できます。
1回(15秒)$0.006(=約0.6円)の有料APIですが、1ヶ月60分、最大240回まで無料で使えます。
APIKEYを取得してみましょう。

とりあえず、音声認識とそれに対する回答するシンプルなデモスクリプト aichat.sh for Mac を作成。
(参考、GoogleのSpeech APIを使ってみた - Qiita

read -p "hit to start" rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav ffmpeg -y -i test.wav -ar 16000 test.flac echo -e "{\n 'config':{\n 'encoding':'FLAC',\n 'sampleRate':16000,\n 'languageCode':'ja-JP' \n }, \n 'audio': { \n 'content': '`base64 test.flac `' \n } \n }\n" > sync-request.json curl -X POST -H "Accept: application/json" -H "Content-type: application/json" --data @sync-request.json https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=【APIKEY】 > response.json python3 talkresponse.py ./aichat.sh

* rec は、音声操作ツール sox に含まれます

音声認識結果 response.json から、認識した文字列を読み取り、会話するプログラム talkresponse.py for Python3 がこちら。(Open JTalkをimportしてます)

# coding: utf-8 import jtalk import sys import time import json import urllib.request cnv = { "おはよう" : "おはようございます", "今日の天気は" : "たぶん晴れです", "こんにちは" : "こんにちは", "がんばって" : "がんばる!", "かわいい" : "ありがとう", "ありがとう" : "どういたしまして", "免許返納について教えて" : "つつじバスとか確かお得に乗れるよ。詳しくは鯖江市のサイトを見てね", "読み書きが苦手です" : "読み書きの苦手なお子さんの相談講座が、3月11日にありますよ", "プログラミングを勉強したい" : "イチゴジャムがオススメ!ハナ道場へどうぞ", "うまいもの" : "サバエドッグ", "甘いもの" : "冬のかんみといえば、みずようかん!", "鯖江のうまいもの" : "サバエドッグ", "鯖江の美味しいもの" : "サバエドッグ", # "鯖江商店街、ミート・アンド・デリカささきの、サバエドッグ", "鯖江と言えば" : "メガネ!鯖江駅から徒歩10分、めがね会館へどうぞ!", "鯖江市長の名前は何ですか" : "まきのひゃくおです", # 写真でるといい } def a(): with open('response.json', 'r') as f: data = json.load(f) s = data['results'][0]['alternatives'][0]['transcript'] print(s) # 認識できた文をとりあえず表示 for t in cnv: if t == s: jtalk.jtalk(cnv[t]) # 対応する回答があった! return if s.endswith("て"): jtalk.jtalk("わかった!") # todo ちゃんとやってあげるプログラムを書く return jtalk.jtalk("ごめんなさい!よくわからないから勉強しておくね。") # todo わからなかった質問を記録しておき、しかるべき人に通知するプログラムを書く a()

とりあえず、いい加減なAIができました!

オープンデータを学習させて、文脈に応じた回答を考えるなど、おもしろそうです。
音声認識&音声合成部分を切り出したデバイスにするために必要なメモリ量は、16kHz、16bit、15秒で約469KB。 ちょっとメモリ大きめのマイコンがあれば、いけそうですね!

ハッカソンの様子が公開されました!

ふわっちコメントの読み上げをPython3でカスタマイズする - Python3 x Open JTalk on Mac

2018/01/11
#maker #python 

Open JTalk on Macを使った読み上げ実験、第一弾は、誰でもなんちゃってテレビ局、生配信サービス「ふわっち」のコメントの読み上げ。

顔文字や新しい言葉がどんどん登場する楽しい日本語の世界、自分で自由にカスタマイズ(transmapを編集)して、ストレスなしの読み上げを実現します。

# coding: utf-8 import jtalk import sys import time import json import urllib.request transmap = { " " : " ", "www" : "w", "iPhone" : "アイフォン", "AppleID" : "アップルアイディー", "一途" : "いちず", "ε" : "", "ω" : "", "(o(" : "", ")o)" : "", "´)ノ" : "", } def talk_whowatch_comment(id, timefrom): with urllib.request.urlopen("https://api.whowatch.tv/lives/%s?last_updated_at=%s" % (id, timefrom)) as r: s = r.read() data = json.loads(s.decode('utf-8')) for comment in reversed(data["comments"]): mes = comment["message"] user = comment["user"]["name"] userid = comment["user"]["id"] s = "%sさん(%s) %s" % (user, userid, mes) for t in transmap: mes = mes.replace(t, transmap[t]) print(s) jtalk.jtalk(mes).wait() return data["updated_at"]; id = sys.argv[1] timefrom = 0 if len(sys.argv) == 3: timefrom = sys.argv[2] print("https://api.whowatch.tv/lives/%s" % id) while True: bktimefrom = timefrom timefrom = talk_whowatch_comment(id, timefrom) print("updated at: %s" % timefrom) if timefrom == bktimefrom: time.sleep(5)

importしているjtalkですが、コメントのJSONデータを取得するためのライブラリ urllib.request などがPython3用なので、jtalk.py もPython3用に修正し、読み上げ終了がわかるようにプロセスのインスタンスを返す用に改造。

# coding: utf-8 import subprocess from sys import argv def jtalk(t): open_jtalk = [ 'open_jtalk' ] mech = [ '-x', '/usr/local/Cellar/open-jtalk/1.10_1/dic' ] htsvoice = [ '-m', '/usr/local/Cellar/open-jtalk/1.10_1/voice/mei/mei_normal.htsvoice' ] speed = [ '-r', '1.0' ] jf = [ '-jf', '0.6' ] fm = [ '-fm', '-1.0' ] u = [ '-u', '0.0' ] outwav = [ '-ow', 'out.wav' ] cmd = open_jtalk + mech + htsvoice + speed + jf + u + fm + outwav c = subprocess.Popen(cmd, stdin = subprocess.PIPE) c.stdin.write(t.encode()) c.stdin.close() c.wait() aplay = [ 'afplay', 'out.wav' ] wr = subprocess.Popen(aplay) return wr if __name__ == '__main__': jtalk(argv[1])

speed, jf, fm あたりをいじると読み上げの音質をいろいろ変更できますよ。


ふわっち - 動画・ラジオの生配信で稼ごう!

自分で創るスマートスピーカー、オープンな音声合成エンジン Open JTalk on Mac

2018/01/10
#maker #python 

音声認識と音声合成を使ったスマートスピーカーがいろいろ登場しています。
コンピューターから離れていても、人に伝える手段として音声は便利なケースもありますね。

お風呂が湧きました。
バッテリーが少なくなっています。
あと1分です。

しゃべってくれる家電を自分で手軽に作る方法として、オープンソースな音声合成エンジン「Open JTalk」を発見。
macでコードから音声を喋らせる (eSpeak, OpenJTalk) - Qiita」を参考にすぐ使えます!

例えば、残り時間をカウントダウンしてほしいときのアプリは、Pythonでjtalk.pyをimportし、このように書けます。(*しゃべってる時間分だけロスタイムあり)

# coding: utf-8 import jtalk import sys import time min = int(sys.argv[1], 10) for i in range(min): jtalk.jtalk("あと%s分" % (min - i)) time.sleep(60) jtalk.jtalk("%s分たちました" % min)

目を使わなくても、使える。
耳を使わなくても、使える。
手を使わなくても、使える。
コンピューターで広がる、いろんな可能性。

今週末は鯖江で「障がい者に寄り添うオープンデータ活用・ハッカソン」の開催です!

前回のアイデアソンなどのアイデアを元に、何か一緒に創りましょう!
障がいをテーマにアイデアソン! コーポレートフェローシップとアイデアソンお助けアプリ

links
- Open JTalk

富士通 x 鯖江市 x Code for Japan! 障害者をテーマにスタート「第4期コーポレートフェローシップ in 鯖江」とPython3で市役所スクレイピング

2017/11/01
#python #opendata #sabae #codefor 

Code for JapanコーポレートフェローシップSAPジャパン奥野さんNECソリューションイノベータ石崎さんYahoo!Japanより廣瀬さんと葛城さんに続く、鯖江、第4シーズン!


コーポレートフェローとして臨時鯖江市職員となった、三ツ山さん(富士通) Hana道場


鯖江市長へ自己紹介&記者会見


早速、地元の購読率ナンバー新聞紙、福井新聞にて掲載&鯖江市長のシェア!


鯖江市役所の担当課の人たちとミーティング、ヒアリングとアイデアソンの予定が決まりました!


いかに一元的、かつ、わかりやすく情報提供ができるか!?
障害者、障がい者、障礙者、障碍者、表記がまずはややこしい・・・。
情報整理など、いろいろ使うため、まずは鯖江市役所のwebサイトをスクレイピング!

使用言語は、Python3、充実のライブラリが楽ちんですね。
scrape sabae / src on GitHub
1615ファイル取得した後に、Stack Over Flow で停止、まだ実用には耐えませんが、参考にどうぞ!

ネット接続IchigoJamを使って大規模プログラムを共有する 〜紙からネットへ〜

2016/09/26
#IchigoJam #KidsIT #python 

日本初のパソコン、日立ベーシックマスター
38年前の今月、1978年9月に日本初登場の8bitパソコン、CPUの周波数はなんと750kHz(0.75MHz)!
RAM4KB、32x24文字のモノクロテキスト、BASICとマシン語、スペックがIchigoJamっぽい!

マシン語やBASIC、周辺機器や自作ゲームの売り買い情報満載の当時のユーザーの熱気が伝わる1984年の同人誌「BASIC MASTER LEVEL2 MAGAZINE」を入手!(LEVEL2とは、ベーシックマスターのROMが4KBから8KBになった拡張用の意)

IchigoJamは、こどもでも手軽に手に取れる紙を基本にしていますが、子供にとってもネットという手段は当たり前、せっかくつくったプログラムは広く公開したくなるはず。 そんなとき便利なこどもネットワークボード「MixJuice」、IchigoJamにこうして挿して使います。

まずは家の無線LANを設定して

?"MJ APC [ssid] [password]

webからダウンロード!

?"MJ GET ichigojam.net/p/B-TOUCH-MASTER.TXT

すぐに遊べます!(ブラインドタッチマスター for IchigoJam

こどもプロコンに応募があった、EEPROMを何スロットも使った大作。一気にIchigoJamに転送するため、Pythonで連結プログラムを作成

# make a combined file for MixJuice on IchigoJam # public domain import os out = open("out.txt", "bw") files = os.listdir("src") for file in files: print(file) out.write(("cls'\nnew\n").encode("SJIS")) fp = open("src/" + file, "br") d = fp.read() fp.close() out.write(d) out.write(("\nsave" + file[0:-4] + "\n").encode("SJIS")) out.write((" \n").encode("SJIS")) out.close()

フォルダに入っているファイルを連結して、out.txt というファイルを生成。これをwebにアップロードしておけば、大作をまとめてEEPROMへとダウンロードできます。 (EEPROMへの保存コマンドが含まれるので、大切なEEPROMをうっかり消さないように注意が必要です、セキュリティの基本は自己防衛!)

MacでPython3とOpenCVの「はじめのいっぽ」インストールから輪郭抽出まで

2016/09/03
#python 

話せる言葉が増えると世界が広がるのはプログラミングの世界も一緒。
人工知能や機械学習で人気なプログラミング言語、Python(パイソン)はじめてみました。
使えるライブラリ(=用途に合わせたプログラムの部品)の数は日々増え続けていて、現在87870コ(PyPI - the Python Package Index)

Macを使っている方は、実はすでにインストールされていて、すぐに電卓替わりにも使えます。
右上の検索で「ターミナル」と打ち込み、出てきた黒い画面で「python」と打ち込んでエンター。
バージョン情報などが出てきて、入力待ち状態になったら、「1+1」などと書いてみます。

$ python Python 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 1+1 2 >>> hex(100) '0x64' >>> bin(0xff) '0b11111111' >>> 2**10 1024 >>> 2**1000 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L

16進数、2進数、べき乗(**)を使ったよく使う計算が簡単にできます。
数の上限がないので、2の1000乗だって計算できちゃいます!

Pythonはバージョン3以降で仕様が変わっているので、本格的に使う場合は、Python3がオススメです。
バージョンが変わるとインストールの仕方も変わってしまうので、思い立ったが吉日!即、設定してしまいましょう。

OpenCV(画像処理で有名な機械学習でもよく登場するライブラリ)をPython3で使う手順
1. 「Download Python | Python.org」から最新版をダウンロードして、インストール
2. ターミナルを開く
3. 「python3」で動くことを確認、Ctrl+D でpythonを抜ける
4. 「pip3 install numpy」と数値計算ライブラリをインストール
5. 「brew install homebrew/science/opencv3 --without-numpy --with-python3」として、OpenCVをインストール(時間かかる)
6. 「brew link opencv3 --force」で設定(不要かも?)
7. 「echo 'export PYTHONPATH=/usr/local/lib/python3.5/site-packages' >> ~/.profile」と設定
8. ターミナルを閉じて、再度開く

OpenCVを使った画像処理、輪郭抽出のサンプル

import cv2 img = cv2.imread("meganesummit2016.jpg") canny = cv2.Canny(img, 100, 200) cv2.imshow('image', canny)

先頭のimportで、OpenCVライブラリを使える状態にして、画像読み込み、画像処理、表示の順。

cv2.imwrite("out.jpg", canny)

で、ファイルとして書き出すこともできます

cv2.destroyAllWindows()

で、ウィンドウを閉じて、またいろいろと実験してみましょう!
OpenCV Tutorials — OpenCV 2.4.13.0 documentation


画像「電脳メガネコンテスト2016」(未来のメガネづくり

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image