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

こどもメイカーフェアを! PythonでIoT黒電話を作って展示する小学生!? MicroPython on WiFiBoy

2018/08/05
#KidsIT #python #rasppi #taiwan 

Maker Faire Tokyo 2018、閉幕。今年もいろんな刺激とたくさんの出会いがありました。
ハッシュタグを追いかけ見つけた、見たかった作品はこちら、IoT黒電話!


なんと小学生がラズパイとPythonで作ったとのこと。こどもの活躍、うれしい!


台湾のプログラミング教育のためのWiFiBoy32で、初MicroPythonに挑戦してみました。

WiFiBoy32で、MicroPythonをインストールし、エルチカするまでの手順
1. esp32用ツールにパスを通す

export PATH=$PATH:/Users/[username]/Documents/Arduino/hardware/espressif/esp32/tools/

2. MicroPythonをダウンロード
3. バイナリを WiFiBoy32 に転送(しばし待つ)

esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART write_flash -z 0x1000 esp32-20180805-v1.9.4-440-g3bef7bd78.bin

4. シリアルで接続する

screen /dev/tty.SLAB_USBtoUART 115200

5. 記事を参考にLEDを光らせてみる

import machine led = machine.Pin(16, machine.Pin.OUT) led.value(0)

* WiFiBoy32のLED、回路図を見るとGPIO16をOFFで光るように接続されている
6. エルチカ(上キーを押したら光りっぱなし)

import machine import utime up = machine.Pin(33, machine.Pin.IN, machine.Pin.PULL_UP) led = machine.Pin(16, machine.Pin.OUT) while True: if up.value(): led.value(1) utime.sleep_ms(500) led.value(0) utime.sleep_ms(500)

できた!
いつものPythonで動くのは便利!

でも、やっぱり短いコードなら、IchigoJam BASICの方が簡単!

10 LED BTN(UP)=0:WAIT30 20 LED0:WAIT30 30 GOTO10

IchigoJamでいろいろいじって工夫して、物足りなさを感じてからのステップアップがおすすめです。


こどもプログラミングの老舗、LEGOマインドストームは20周年!貴重な初代モデル展示がありました!


子どもプログラミング喫茶、たくさんの感動が生まれました!


大人も体験プログラミング!


訪ねてきてくれたIchigoJamオーナーと記念写真!


USBシリアルと電源の切り替えスイッチを搭載した、自慢のオレンジカムロボを見せてくれました。


IchigoJam、一度教わると、教えられそうかなっと思えるくらいの簡単さが特徴です。
大人にも喜んでもらえるとうれしい!


上級者にはIoT対応IchigoSodaをいろいろいじってもらってメンタリング。どんどん勝手に夢膨らむ感じがステキ!


IchigoJamの初参加!OtOMOの倉本さん、楽しい機会をありがとうございました!


15歳のWiFiBoy創業者、PCNブースにも来てくれました!


供の操縦、楽しそう!タミヤのムカデロボ、すでにサーボでラジコン化されてました。


PCN北千住&PCNブース、おつかれさまでした!


PCNブース、たくさんのご来訪ありがとうございました。子供でもできちゃう手書きPOPメソッド。


花添えた、未就学児でも楽しめるプログラミング環境「IchigonQuest」のエルイー


たくさんのこどもたち!


こどもが作った作品を、こどもが楽しむ!


こどもが開発、笑顔になれるボタン!


高専カンファレンス、おびなたさん!


イスラエルから!


Pimoroni x MagPi


ラズパイユーザーグループ太田さんと!


同時開催のデザフェス、オレンジの作業服が決まってる「紙でできた道路アクセサリー」というレアジャンル!


極小LEDをなんと手半田して作っている光るペンダント。光るアクサリー、来ますね!


大好きなBLAMEのような世界観。


融合するともっと楽しいことになりそう!


Startup Weekend Tokyo @ Maker Faire Tokyo


今回のMaker Faire内開催の発端となった、大田区、スゴイ!沖縄も鯖江市も負けてはられません!


子供の発想による自由な作品が増えるともっとすごいイベントになりそう!
Maker Faire、次は大垣開催

把握しきれない多量のデータはコンピューターに丸っと投げよう!機械学習と触れ合うTensorFriday、手書きテストデータ生成アプリ

2018/07/13
#AI #js #python 

100円コンピューターでも秒回5000万計算。 元々はグラフィックス用に開発されたGPUの汎用利用により、手軽に秒間1兆回という単位の計算をこなせるようになっている現代のパソコン。 普段はその持てる力をほとんど使っていない状態です。

AIの一種、機械学習は脳をモデル化したもの。入力と出力をつなぐ、大量のパラメーターを有り余るコンピューターの計算力を使って、いい感じに求める技。 複雑な脳のモデル化(ディープラーニング)も、現代コンピューターによってなんとかなってしまう時代です。

機械学習に便利なオープンソースなライブラリTensorFlowと触れ合う金曜イベント、TensorFriday#02のテーマは手書き文字認識。 短いPythonのプログラムを動かして、ディープじゃないラーニング(nn)の結果と、ディープラーニング(cnn)の結果を体験しました。

せっかくなら、自分でかいた文字を認識させてみたいところなので、webアプリのお絵かきツール「freepad」を改造してPython用の28x28の配列データを生成するアプリ「fornn」を作成。 見事、パッドで書いた下手な数字「5」を認識してくれました!

テストデータを入れ、5を認識するように改造した nn.py in Python3

次回のTensorFlow#03に向けた、講師やテーマ、募集中!

Code for Japan 地域フィールドラボ、健康と特定健康診断をテーマにしたディスカッション。
人ではとても見きれない健康に関する多量のデータでも、機械学習に突っ込んでみることで、なんとかなりそうな気がします。

links
- Hana道場、若宮さんと学ぶIoTとIchigoJamプログラミングと地域フィールドラボ第5期スタート!
- 地域フィールドラボの募集テーマを大公開! | Code for Japan

自学の罠、ペアプログラミングのススメとちょっと便利な手元辞書づくり

2018/07/03
#python 

元ホワイトハッカーな友達、あみるとペアプログラミング。
得意なwebアプリ&SPARQLと、あまり触らないサーバーサイドの知識。
1台のPCを2人で使う、ペアプログラミング形式でトレード。

無数に存在し、日々世界中の開発者によって進化するソフトウェアという道具。
慣れているがゆえの罠は、ちょっとの不便が日常化してしまうこと。
便利なツールがないかと探す手前で、毎日少しずつ、時間ロスを積み重ねていることになる。

ペアプログラミングという共同作業で、明らかになるちょっと便利。
それならこうするともっと便利、これを使うと楽、こんな方法もあるよ、など。
教わるだけでなく、教えられることもあり、なかなかおもしろい体験。

伝授してもらったエンジアリングツール
軽量仮想環境 docker
便利と噂の iTerm2
高速ウィンドウ整理 ShiftIt
クリップボードマネージャー Flycut
PCパスワードで保存パスワードは確認できちゃう(再発行手間を省く) Chrome
DvorakユーザーとQwertyユーザーがペアプロするためのドングル QIDO

そこまで困ってないからこそ、その場でコミュニケーションしながら最速の学習時間で導入できることにメリットあり。

ちょっとした不満、やり過ごさないために、前々から思っていたすばやく使える手元英和辞書を作成。


dict - コマンドラインから英単語を入れると、ヒットする項目を日本語と共に表示するツール

手元辞書 dict 作り方
1. オープンソースな辞書を検索。(マッシュアップ可能なライセンスの英語辞書(フリー辞書)
2. ライセンスが、CC BY SA EDRDG の辞書に決定
3. ダウンロードしてみる JMdict-EDICT Dictionary Project 内の "JMdict_e.gz - the JMdict file with only English glosses"
4. 中身は巨大な1ファイルのXMLと確認

<entry> <ent_seq>2836190</ent_seq> <k_ele> <keb>北京原人</keb> </k_ele> <r_ele> <reb>ペキンげんじん</reb> </r_ele> <sense> <pos>&n;</pos> <gloss>Peking man (Homo erectus pekinensis)</gloss> </sense> </entry>

5. Python3でプログラムを書く

# coding: utf-8 import sys from xml.etree.ElementTree import * key = sys.argv[1] print("keyword: " + key) tree = parse("JMdict_e") ele = tree.getroot() cnt = 0 hit = 0 for e in ele.getiterator("entry"): s = e.find(".//gloss").text if key in s: ja = e.find(".//keb") if ja != None: print(ja.text) else: ja = e.find(".//reb") if ja != None: print(ja.text) print(s) hit += 1 cnt += 1 print("hit: " + str(hit) + " / " + str(cnt))

6. 使える!便利!
高速化や、辞書を拡充する機能、しゃべらせる機能などは必要に応じてつくる、お楽しみにとっておく。

ペアプログラミング、ハッカソンなどのイベントから実践してみると良さそう。
凄腕ハッカーに、ザザっとアセスメントしてもらうサービスもありかも。

自学は大事、でも、その罠を認識することもまた大事。
うまくハマれば、大いに時間を創り出してくれるのが、ツール。
お気に入りの道具、シェアしましょう!

声だけでプログラミング! 耳がついたスマート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 で停止、まだ実用には耐えませんが、参考にどうぞ!

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