公開用に作成した keystore をデバッグで使うには

公開用に作成した keystore をデバッグで使うには

Android のアプリは公開するためには
keystore ファイルの作成と
それによる電子署名が必要

そしてすでに公開しているアプリをデバッグするには
この keystore ファイルでデバッグすることになる

これをやらないと Google Map のアプリの場合
地図が表示されなかったりするので注意

Eclipse での設定方法は
window > Preferences
で設定画面がでるので

Android > Build

Custom debug Keystore の設定を行う
ここで Browse をクリックして
公開に使用した keystore ファイルを指定

keys

しかし
Keystore was tampered with, or password was incorrect
とエラーがでてしまう

理由を調べた結果
デバッグに使うパスワードが android でないとダメ
ということ

これを元に検索した結果
Android:商用署名(キーストア)をデバッグ用に変更する手順
http://yuki312.blogspot.jp/2013/05/android.html
によると

Eclipse ADT で使えるデバッグキーストアの条件は
keystore のパスワードが android
エイリアスが androiddebugkey
エイリアスパスワードが android
であることとのこと

このため keytool コマンドでこれらの条件を満たすように変更します

なお、念のため別のディレクトリにコピーしてから
行うようにします

mkdir android_release_debug
cp snowpool.keystore   android_release_debug/
cd android_release_debug/

これでコピーしたので、失敗したらやりなおしできる
まずは keystore のパスワード変更

keytool -storepasswd -keystore snowpool.keystore 

これで最初に今のパスワードを入力し
次に 変更するパスワードに android を入力

次にエイリアスを変更

keytool -changealias -alias snowpoolkey -keystore snowpool.keystore 

これで最初に 新しいエイリアスを入力するので
androiddebugkey

次に キーストアのパスワードを聞かれるので
android

最後に鍵パスワードを入れるけど
これは keystore ファイルをつくったときんパスワードで android ではないので注意

次にエイリアスパスワードの変更

keytool -keypasswd -alias androiddebugkey -keystore snowpool.keystore 

最初にキーストアパスワードを入力するので androidを入力
次に現在の鍵パスワードを入力するので
keystore ファイルを作成したときのパスワードを入力
新しい鍵パスワードを聞かれるので
android
を入力
これで設定完了すれば
Custom debug keystore にセットするときに
エラーがなくなり
MD5 fingureprint
SHA1 fingureprint
にも自動的に値が入力されます

これで再度アプリを実機デバッグすると
Application Install の警告がでてきます

keys2
どうやら debug に使うキーストアが変更されたため
以前のアプリをアンインストールし
新しい状態でインストールしますか?
と聞かれているので
yes

これで、表示されなかった地図も無事に表示されるようになりました

Android Developer Console にアプリ登録

Android Developer Console にアプリ登録

まず
Google アカウントを取得
とはいってもすでに Android のスマートフォンなら
すでに持っているし、
Gmail を使っているのならそのアカウントでOK

URLは
https://play.google.com/apps/publish/

なおアプリの公開には開発者登録が必要で
25$必要
play1-2

また、複数のアカウントの場合
実際に支払ったアカウントのみ有効

Developer Consoleにログインしたら
Google Play に Android アプリを公開
をクリック

play

すると新しいアプリを追加するダイアログがでるので
デフォルトの言語
タイトルを設定

タイトルにはアプリ名でOK

play2

入力したら APKをアップロードをクリック

どの形式で公開するか聞かれるので
通常なら製品版を選択

play3

そして製品版に新しいAPKをアップロード
をクリックすると、アップロードする画面になるので
作成した apk ファイルを選択

ファイルを選択すると後はアップロードが始まるので
そのまま待ちます

play5

これでアップロードが完了すると
バージョン1として登録されます

これで
APK とかかれたところにチェックがつきますので
次にストアの掲載情報
をクリック

play6

簡単な説明

詳細な説明
がありますが
簡単な説明は Google Play で最初に表示される
アプリの説明で

詳細な説明は
もっと読む
をクリックしたとき表示される説明となります

ply7

説明文ができたら
高解像度アイコン
そして
宣伝用画像を用意します

play8

高解像度アイコンについては
作成した Eclipse のプロジェクトのなかに
ic_launcher-web.png
があるのでこれをドラッグ&ドロップします

play9

問題は宣伝用の画像です

実機デバッグで動作確認もとれたので
実際にナビをする画面を掲載する予定でしたが
apk ファイルをアップロードし
画像のスクリーンショットをとろうとしたところ
Google Map の地図が表示されません

このためしばらくいろいろと調べてみようと思います

apk ファイル作成と署名

apk ファイル作成と署名

電子証明書を keytool コマンドで作成したので
今回は apk ファイルを作成

プロジェクトを右クリック

Android Tools > Export Signed Application Packages
を選択
これでできると思ったけど
Exoirt Abirted
とエラーがでてしまう

apk

エラーメッセージは
Export aborted bacause fatal lint erros were found
These are listed in the lint View
Elther fix these befre running Export again or turn off Run full erroor check when exporting app
in the Android > Lint Effor Checking preference page

ここででてくる Lint はソースコードの静的解析

これはセキュリティ
パフォーマンス
ユーザビリティ
アクセシビリティ
国際化などのチェック項目に引っかかっている
ということ

この場合の対処方法は
ソースコードの修正
もしくは Lint のチェック項目の緩和となる

まずはソースコードを修正しようとしたけど
エラーのでているのが
/res/values/strings.xml

<string name="app_name">PhotoNavi</string>

さすがにアプリ名でエラーは理解できなかったため
Lint app_name
で検索

Android Lintでエラーがでる

を参考にしてみたところ
ライブラリの言語リソース設定が
それを利用しているアプリの
リソース設定にまで影響してくる
とのことです

このため
Lint のチェック項目緩和の手段をとることに

設定するのは
Missingtranslation を無視するようにすること

プロジェクトを右クリックし
Properties を選択

Android Lint Preference を選択し
missingt
まで入力して
MissingTranslation の項目を検索

設定値を Fatalから Warning に変更し
applyをクリック

apk3

これで変更するとエラーがなくなり次にすすめるように

もう一回
プロジェクトを右クリックして
Android Tools > Export Signed Application Packages
を選択

するとapk ファイルにするプロジェクト名がでるので
Next をクリック

apk4

次に keystore ファイルを指定する
すでに作成済みなら
use existing keystore にチェック
Browse で場所を指定

Password には keystore ファイルのパスワードを入力する

apk5

次にAlias とパスワードを設定
これも同じパスワードになる

次の画面では
appk ファイルの保存先を指定する
Destination APK file
の横へ保存場所とファイル名を入力
拡張子は
.apk
になる

これは Browse ボタンで保存場所を開くだけでよい

場所が決まったら finish をクリックすると
apk ファイルが作成される

作成された apk ファイルに署名ができているか
調べるには jarsigner コマンドを使う

jarsigner -verify -verbose -certs PhotoNavi.apk 

というように
jarsigner -verify -verbose -certs apkファイルのパス
で実行すると署名されているなら
その署名内容が表示される

Android ランチャーアイコン作成

Android ランチャーアイコン作成

Android Icon Set – お手軽なアイコン作成
http://papakingyo-android.blogspot.jp/2013/08/android-icon-set.html?m=1
を参考に
ランチャーアイコンの作成

まずは Eclipse を起動

アイコンを変更したいプロジェクトを右クリックし
New > Other

ダイアログがでてくるので
Android Icon set
を選択し Next をクリック

icon

すると、どのアイコンを作成するのか選択する画面になるので
Lancher icons をクリックし
ファイル名を変えたいのなら
Icon Name

ic_lancher から変更する
そのままでよいなら Next をクリック

icon2

次に、どのようなアイコンにするか選択する画面がでてくる

最初はテキストタイプのアイコンになる

Background color で背景色の設定
Foreground color でも辞職の設定
Text にはアイコンに使う文字を設定

現在の状態だと
赤い背景に黒文字で aA
とかかれたアイコンができる

icon3

なお Foreground が現在 Text になっているので
テキストアイコンだけど
Image をクリックすれば
自分で用意した画像を使用することも可能
自作が面倒な場合は外注したりするという方法もありです

Browze で画像を検索

Shape は、アイコンの枠をどうするかを指定します

None なら枠はなし
Square なら四角
Circle なら円となります

icon4

アイコンについては
フリー素材で商用可能なものもあるので
それらをダウンロードカスタマイズするという方法もあります

Android アイコン 商用 フリー
で検索したら
2014年、無料で商用利用できる最新フリーアイコン素材のまとめ

というものもありました

そして最後にクリップアートを使う場合

これは Android SDK で用意されてる
クリップアートを使います

Clipart を選択し
選択します

Background Color ではクリップアートの背景色
Foreground Color でクリップアートの色を設定

icon6

変更が完了したら Finish を選択
これで
アイコンを置き換えてもよいか聞かれるので
yes all ですべて置き換えます

icon7

これでアプリのアイコンが変更されます

次回は apkファイルの作成と電子署名になります

Android アプリ名の修正

公開のためにソースを編集していたら
アプリ名が消えてしまったので修正

まず
res/values/strings.xml

<string name="app_name">PhotoNavi</string>

を追加

次にAndroid Manifest.xml の
application タグと activity タグへ

android:label="@string/app_name" >

を追加

これでアプリ名に戻った

これを消してしまうと、アプリ名ではなく
パッケージ名が表示されるようになるので注意

androidリリースのための署名の準備

androidリリースのための署名の準備

Android開発で使うコマンド

を参考に

リリースのための署名ファイルを作成

今回、署名は端末から keytoolコマンドで行う

構文は

keytool -genkey -v -keyalg <鍵生成の暗号化方式> -keystore <証明書ファイル名> -alias <証明書別名> -validity <有効期限の日数>

これをもとに

keytool -genkey -v -keyalg RSA -keystore /home/snowpool/snowpool.keystore -alias snowpoolkey -validity 18250

と実行

実行するとパスワードを入力することになる
ただしセキュリティのためか
入力した文字は表示されない

入力後確認のためもう一回入力する

すると姓名を入力することになるので
そのまま入力

組織単位名とか組織名を聞かれるけど
これは個人で開発するので
personal でOK

ここの部分については
Androidアプリへの署名の付け方

を参考にさせていただきました

都市名はそのまま住んでいるところの市町村
州名や地域名は都道府県を入力

単位に該当する2文字の国番号は
日本なら
JP

最後に上記の内容でよいか聞かれるので
yes
を入力

すると鍵パスワードを入力してください
とでるけど
キーストアと同じなので Enter でOK

これで署名ファイルができたので
署名の確認を行う

keytool -list -v -keystore snowpool.keystore

で設定したパスワードを入力すると
詳細をみることができる

なお GoogleMap API key で
この証明書の中のSHA1の値が必要になるけど
-v をつけ忘れると表示されないので注意

ここでSHA1の値を確認したら
Google Developers console へログインし
デバッグ用キーのSHA1の値から
自分の keystore ファイルのSHA1の値に変える

https://console.developers.google.com/project
へアクセスして
過去に自分が作成したAPIキーの編集をする

ここまででkeystore の作成と
API key の変更ができたので
次回はアプリのアイコン作成

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パースのソースが載っていたので
これを使わせていただくことで無事に動作することができました

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