いろいろ備忘録

雑記です。

PocketSphinxを「無理やり」日本語で使う

やりたかったこと

Androidアプリをスマートスピーカーのように「こんにちは」という音声を認識したら何か処理を始めるようにする。

音声認識にPocketSphinxを選んだ理由

トリガーとなる音声を認識するために連続音声認識をする必要がありますが、Android組込のSpeechRecognizerや、精度が高いGoogle Cloud Speech APIなどは時間制限がありました。ので音声認識エンジンを別途組み込む事にしました。

PocketSphinxとは、フリーの音声認識エンジンです。
音声モデルが英語のものしかないため、本来は日本語には使えません。Juliusが日本語に対応しているので、一般的にはそちらが使われます。

しかしJuliusはネットワークから使用するには、ADINNETで音声を送信して結果は別で受取り...など面倒な事が多く、また、Androidに組み込むのも手軽にはいかなさそうでした。更にリファレンスを読み解くには多くの予備知識が必要そうです。

一方、PocketSphinxは公式がAndroidのサンプルを公開しており、気軽に実行できました。書かなければならないコードも分かりやすいです。

「無理やり」日本語を認識させるためにやったこと

PocketSphinxは単語と発音記号の対応をdictファイルから読み込みます。

 hello HH AH L OW

日本語の発音→英語の発音をそれらしく書き換えてdictファイルに追加します。

konnichiwa K OW N N IY CH IY W AA

うまく認識されない場合は、konnichiwa(1)のように他の発音を追加するか、しきい値を上げます。

 

okhttp3のwebsocketでのサブプロトコル定義

クライアントは、WebSocketコネクション確立時に、対応可能なサブプロトコル一覧をSec-WebSocket-Protocolヘッダで提示します。

OkHttpではRequestクラスでヘッダを追加出来ます。

そのClientが送るリクエスト全てまたは条件を満たすものに追加したいならInterceptorを使用しましょう。

今回のケースではWebSocketでのrequestはひとつだったので使いませんでした。

サブプロトコル名はアプリケーション側で勝手に決めて大丈夫なものなので、各自サーバが対応する適切なものに変えましょう。

Interceptorを使用しないとき

Request request = new Request.Builder()
.addHeader("Sec-WebSocket-Protocol", "test")
.url(WS_URL)
.build();

Interceptorを使用するとき

Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request req = chain.request()
.newBuilder()
.addHeader("Sec-WebSocket-Protocol", "test")
.build();
return chain.proceed(req);
}
};

OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();

 

 ビッグエンディアンからリトルエンディアンに変換

google cloud speech APIを使用するときに書きました。

サンプルで使用されているLINEAR16はPCM16のリトルエンディアン版みたいです。

PCM16は16bit=2byteなので、bytes[i+1] bytes[i]に変換していく作業です。

short型でのコードはこちら。

public static byte[] short2little(short[] sData) {
ByteBuffer buffer = ByteBuffer.allocate(sData.length * 2);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.asShortBuffer().put(sData);
return buffer.array();
}

 

onClosed vs onClosing in OkHttp3のWebSocketクラス

【結論】

onClosing()は成功でも失敗でもとりあえず実行される。

onClosed()は切断が成功した場合実行される。向こう側から一方的に閉じられた場合は実行されない。

順序はonClosing()の後にonClosed()

続きを読む

データバインディングでOrmaとRecyclerView

Ormaの公式のexampleを再現する形でやっていきます。

Ormaは入っていて、モデルを作ってビルドした後という前提です。

exampleではTodoモデルなので、適宜使用するモデルに変更しましょう。 

 

1.build.gradleにバインディング設定を追記。CardViewとRecyclerViewも書いておく。

Android Databinding 〜超入門〜 - Qiita

implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:cardview-v7:26.1.0'


2.フラグメントを作成し、xmlのルートをFrameLayoutからlayoutに変更し、ルートのwidthとheight属性、TextViewも消す。RecyclerViewを足す。

参考:

Android-Orma/fragment_recycler_view.xml at master · maskarade/Android-Orma · GitHub

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.example.android.プロジェクト名.なんたらFragment">

<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eee"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
/>

</layout>

 

3.公式を参考にFragmentのjavaの方の必要なさそうなソースを消しておく。

Android-Orma/RecyclerViewFragment.java at master · maskarade/Android-Orma · GitHub

 

4.CardViewのXMLをlayoutディレクトリに作成する。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/tools"
>
<data>
<variable name="user" type="com.example.android.パッケージ名.infra.entity.User" />
</data>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="2dp"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:text="@{user.name}"
/>
</android.support.v7.widget.CardView>
</layout>

 

5.VH、Adapterの順にコピペしてくる。

Android-Orma/RecyclerViewFragment.java at master · maskarade/Android-Orma · GitHub

6.onCreateViewをいい感じにする。

7.Activityに作ったフラグメントを紐付ける。

このとき、Fragment側で継承しているフラグメントがサポートライブラリならgetSupportFragmentManager()を使用しないとaddが解決出来ない。

 

以上です。

getItemCount()などでUIスレッドからOrmaを利用するため、OrmaDatabaseの生成時に実行スレッドの制約をしていると落ちるので気をつけてください。

 

制約を外すよりもっといいやり方があったら教えてくれると幸いです。

カミンスキー攻撃について

hogehoge.www.example.jp.の解決に対し、

応答がこうなる。

 

アンサーセクション
ANSWER SECTION

hogehoge.www.example.jp. 86400 IN A なんでもいい

解決した結果。

ここは何でも良い。

 

権威セクション
AUTHORITY SECTION

www.example.jp. 86400 IN NS dns1.攻撃者が用意した.com.

その結果をもつDNSサーバ一覧。

これで、被害を受けているキャッシュサーバ上から

www.example.jp.の正規の権威DNSサーバのキャッシュが消えたら、

www.example.jp.についての解決要求をdns1.攻撃者が用意した.com.に送るようになる。

 

アディショナルセクション
ADDITIONAL SECTION

オーソリティセクションのDNSサーバのAレコードとか

ここにdns1.攻撃者が用意した.com.のAレコードを書く場合もある。

 

情報セキュリティ 対策のしおり 覚書

サポートの切れたOSやソフトウェア

脆弱性が見つかっても、脆弱性を解消するための修正プログラムが作成されないため危険。

ネットワークからの攻撃対策

スケアウェア

脅迫するウイルスのこと。例えば、「あなたのパソコンはウイルスに感染しています。」などとニセの情報を表示する。

ボット

パソコンに感染し、そのパソコンをネットワークを通じて外部から操ることを目的として作成されたプログラム。 これが指令サーバを介してボットネットを構成する。

ウイルス対策ソフトの設定

パスワード盗難対策

  • 必要に応じて変更
  • 紙に書き留めて放置しない
  • パソコンに保存しない
  • いつ漏洩するか、または漏洩したかわからないので、定期的な変更
  • 他のサービスでなりすまされないように使いまわさない

ファイルサーバやオンラインストレージ、ネットワーク接続の複合機

サーバやネットワーク接続機器は必要な人にのみ共有されるよう設定する。

脅威や攻撃の手口を知るために

利用中のウェブサービスや製品メーカーが発信するセキュリティ注意喚起を確認し、社内で共有する

電子メールの誤送信防止

送信ボタンを押す前に、再度宛先とメールの内容の整合性を確認する 複数の人に送信する際には、送り先の指定方法(To, CC, BCC等)を確認する 具体的には→目視にて送信先アドレスの確認

電子メールの情報漏えい対策

電子メールを保護する理由
  • 間違った相手に届いても安心
  • 通信経路で盗聴されても安全
具体的な情報保護方法
  • メール本文の暗号化 PGP, S/MIMEを利用する

  • 電子メールの添付ファイルを暗号化して送受信する方法
    一般的なドキュメント作成ツールやファイル圧縮・解凍ツールでパスワード保護する

  • 専用サーバに格納し、宛先には一時的なアクセス権を渡す方法

電子メール本文や添付ファイルを専用のサーバに格納する。 電子メールの宛先には、該当ファイルの一時的なアクセス権(URL, アクセス用の利用者IDとパスワード)を渡す。

利点
  • 間違った宛先に情報を送信してしまった場合でも情報にアクセスできないように制御できる
  • 情報が宛先に伝わったかどうかがサーバの履歴を参照することで確認できる
暗号化した添付ファイルのパスワードの送りかた
  • 直接本人に電話等で伝える
  • あらかじめパスワードを決めておく

バックアップの注意事項

  • 定期的なバックアップ
  • 戻せることの確認
  • バックアップ媒体は安全に管理し、情報漏えいを防ぐ バックアップ元の情報と同じ環境はNG。 同じタイミングで壊れるまたは盗難に遭う可能性があるため。
  • 不要になったら確実に消去

重要な情報の管理

保管場所を定め、作業に必要な場合のみ持ち出し、終了後に戻すことを徹底する。 机の上に放置せず、鍵付き書庫に保管する。

重要な情報の持ち出し

ノートパソコンやスマートフォンの利用にあたって、 パスワードの入力を求めるように設定したり、 データファイルを暗号化するなどの対策を事前に行う。

関係者以外の立ち入りの制限

サーバ、書庫、金庫など、重要な情報の保管場所の近くには、 無許可の人が近づけないようにする。

対策

事務所で見知らぬ人を見かけたら声をかける

事務所での機器の盗難対策

退社時に、机の上のノートパソコンや備品を引き出しに入れ、施錠する

事務所等での入退出管理

最終退出者は、事務所を施錠し、退出の記録(日時、退出者)を残す

重要な情報を廃棄する際の注意点

書類は細断、データは消去ツールを使う。

OSのファイル削除機能で削除できるのは見かけ上だけ。 記憶媒体の寿命を延ばせるし、削除機能の見ための処理が速くなるため。 専用のファイル復元ソフトを利用すると、削除したファイルの記録位置が 他のファイルによって使われていなければ、復活する場合がある、

USBメモリからの漏洩対策
  • 貸し借りをしない。
  • 自動暗号化の出来る暗号化USBメモリを利用する。