追記

日々をアレコレ


2019年04月22日

Raspberyy Pi+ Window10 IoT Coreで日本語音声認識

c# - Windows 10 iot core language installation for speechRecognizer - Stack Overflowを見ると、全くチェックしてなかったけど、Windows IoT Coreのアップデートに追従する形で、日本語の音声合成とか音声認識に必要なパッケージも更新されていたらしい。幸い、電車でGoコントローラの改造に使ってるRasPiに載せてるのが17763だったので、次の手順でパッケージをインストールしたら昔作ったやり方で日本語の音声認識が問題なくできた。

  1. Download Windows 10 IoT Core から、Windows 10 IoT Core Packages – Windows 10 October 2018 Update - January Refresh (SAC) をダウンロードする。

  2. ダウンロードしたISOをマウントするといくつかのインストーラがあるので、Windows_10_IoT_Core_ARM_Packages.msiをインストールする。

  3. C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm\freというフォルダにMicrosoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package~31bf3856ad364e35~arm~~.cabがあるので、これをUSBメモリとかを使って、RasPiのWindows IoT Coreにコピーする

    僕は、USBメモリにパッケージファイルをコピーして、そのUSBメモリをRasPiに挿して起動させ、IoT DashboardからPowerShellを使って接続して、コマンドラインでコピーした。

  4. IoT DashboardからPoweShellで接続して、パッケージファイルをコピーしたディレクトリに移動して、次のコマンドを実行する。

    applyupdate -stage Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package~31bf3856ad364e35~arm~~.cab
    

    少し時間がかかって SUCCESS: Staging succeeded と表示されたら次に、次のコマンドを実行する。

    applyupdate -commit
    

    これでパッケージの適用が開始されるので、後は終わるまで待つ。自動的に再起動がかかり、適用処理が結構時間かかるのでひたすら待つこと。

  5. いつもどおりWindows IoT Coreのデモ画面などスタートアップのアプリが立ち上がったら完了。

実際に音声認識とか音声合成するにはそのためのUWPアプリを開発が必要。


2019年04月21日

AndroidのToggleButtonカスタマイズ

AndroidのToggleButtonて見た目がなんとなくイケてないのでカスタマイズするためのメモ。まず、Viewに固定で配置する場合について。ToggleButtonの背景として利用するdrawableとして、res/drawable/my_toggle_selector.xml を次のように作成する。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <layer-list>
            <item android:bottom="5dp" android:top="5dp">
                <shape android:shape="rectangle">
                    <size android:height="35dp"/>
                    <corners android:radius="5dp"/>
                    <solid  android:color="#0000ff"/>
                </shape>
            </item>
        </layer-list>
    </item>

    <item android:state_checked="false">
        <layer-list>
            <item android:bottom="5dp" android:top="5dp">
                <shape android:shape="rectangle">
                    <size android:height="35dp"/>
                    <corners android:radius="5dp"/>
                    <solid android:color="#ffffffff"/>
                    <stroke android:width="1dp" android:color="#0000ff"/>
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

これは、高さ35dpで、半径5dp、選択時には青(#0000ff)の背景色、非選択時には白(#ffffff)の背景で青(#0000ff)で1dpな太さの枠線を持つ矩形を定義している。さらに、ToggleButtonのテキスト色を定義する res/color/my_toggle_text_color.xml を次のように作成する。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="#ffffff"/>
    <item android:color="#0000ff"/>
</selector>

これは、選択時には白(#ffffff)、それ以外は青(#0000ff)という定義になっている。これらを使ってレアウとファイル上でToggleButtonを次のように書く。

<ToggleButton 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="text"
    android:textOff="text"
    android:textColor="@color/my_toggle_text_color"
    android:button="@null"
    android:background="@drawable/my_toggle_selector" />

これで、非選択時には青い枠線に青で「text」、選択時には青い背景に白で「text」と書かれたToggleButtonができる。ただし、このままでは、表示文字列が短い場合はToggleButtonのデフォルトの最小サイズが適用されるし、逆に長い場合には矩形枠との間の余白が小さくなってしまうので次のように android:paddingLeftandroid:paddingRightandroid:minWidthを次のように定義すると、テキストに合わせた幅で、矩形との間に余白もできる。

<ToggleButton 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOn="text"
    android:textOff="text"
    android:textColor="@color/my_toggle_text_color"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:minWidth="0dp"
    android:button="@null"
    android:background="@drawable/my_toggle_selector" />

で、これをコードから動的に作るためには、Kotlinを使う場合、次のように書く。

// とりあえずActivityクラス内の処理
var toggle = ToggleButton(this)

toggle.text = "text" // これがないと最初の表示がtextにならない
toggle.textOn = "text"
toggle.textOff = "text"
toggle.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
toggle.isAllCaps = false // デフォルトでtrueだから"text"が"TEXT"になってしまう
toggle.setPadding(10, 0. 10. 0)
toggle.background = ResourceCompat.getDrawable(resources, R.drawabale.my_toggle_selector, null)
// テキストの色設定のListを作成する
var states = arrayOf(
    intArrayOf(android.R.attr.state_checked),
    intArrayOf()
)
var colors = intArrayOf(Color.WHITE, Color.BLUE)
var colorStateList = ColorStateList(states, colors)
toggle.setTextColor(list)
toggle.minimumWidth = 0
toggle.minWidth = 0 // minimumWidth/minWidthの両方が必要

res/drawable/my_toggle_selector.xmlは必ず必要で、ほかはコード上ではxmlで定義するよりもやることがいっぱいっぽい。


2018年12月04日

Visual Studio Codeでdoxygen

個人が何かを目標を持って業務を取り組んでいるというよくわからない活動をしなきゃならなくったので、できるだけ深呼吸くらいの手軽さで実現できるものをと考えた結果、ソースファイルにコメント入れてDoxygenに食わせてソースの仕様を自動生成することにした。で、その時にやったことをざっくりとメモ。

まず、Dogygenの環境をインストール。今回はWindows向けのsetupファイルをダウンロードしてインストール。インストールしたのは少し前であまり覚えていないのだけど、多分デフォルトでインストール先をパス通すようになっているらしいので、とりあえずこれでどこからでもdoxygenコマンドが呼び出せるようになる。次に、出力ファイルの設定をする。ソースコードからドキュメントをDoxygenで生成する を参考に、doxywizardを使って、ファイルの保存先、ソースファイルのルートディレクトリ、出力先の設定や出力方法などの設定をウィザードで編集して保存する。今回は、ESP-IDFのプロジェクトメインフォルダを対象に、日本語でHTMLファイルを生成するような設定を作って保存した。念の為、実行して内容を確認。ここまででとりあえず、コメントから仕様を自動生成することができるように。

で、今やっているのはESP-IDFのプロジェクトをVisual Studio Code上で開発しているので、その設定もしておく。まず、VSCodeに拡張機能 Doxygen Documentation Generator - Visual Studio Marketplace をインストール。これで、/** と入力して開業すると直後の行のヘッダがテンプレートから作られる。ファイルの先頭だとファイルヘッダコメントになる。これがあるとだいぶと楽になる。次に、プロジェクトの「task.json」ファイルを編集して以下のタスクを追加する。

"label": "make doxygen",
"type": "process",
"windows": {
    "command": "doxygen",
    "args": [
        "(保存した設定ファイルのパス)"
    ]
}

コマンドパレットから「タスクの実行」を選択して、「make doxygen」を実行すると設定ファルに従って仕様が生成されるようになる。これで、VSCodeだけで仕様書まで生成できるように。


2018年11月06日

ESP32でBlutooth HID

個人的にメモ。

ESP32とBluetoothコントローラーをHID(Bluetooth Classic)で接続する簡単な方法 - Qiita の記事に従えてば、BluetoothなゲームパッドをESP32からbtstackを使って接続できるようになる。今回使ったのは8BITDOのBluetoothゲームパッドなので、その辺りも記事とほぼ一緒。流れとしては、

  1. ESP32が起動して、接続待ちになる。
  2. 「X+Start」長押しでゲームパッドをHIDモードで起動する。
  3. しばらくすると接続完了。

アナログスティックなしのモデルを使ったせいなのか、十字キーの状態変化が非常に面倒な感じだったけど、それ以外は特に問題なく素直な感じでデータも取得できそう。ややこしいのはStartボタンを長押しするとゲームパッドの電源が落ちちゃうこと。サンプルだと切断されると再接続しないので、そのへんの処理も実際には必要になるっぽい。


2018年08月22日

ESP32の開発環境構築

ESP-WROOM-32を本格的に使うことになったので、そのための開発環境の構築方法。

Arduino IDEを使う場合

GitHub - espressif/arduino-esp32: Arduino core for the ESP32 に書いてあるとおり。

  1. Arduino IDEをインストールする。
  2. 「ファイル > 環境設定」を開き、「追加のボードマネージャのURL/Additional Board Manager URLs」に https://dl.espressif.com/dl/package_esp32_index.json を追加する。
  3. 「ツール > ボード > ボードマネージャ」を開く。
  4. 検索フィルタに「esp32」を設定すると、「esp32 by Espressif Systems」が表示されるのでそれをインストールする。
  5. ボードの各設定は利用するものに合わせる。
  6. 「ツール > 書込装置」は「USBasp」を選択する。

書き込み時に、接続待ちになる場合は「Boot/Program」、「Enable/Reset」の順にボタンを押して、「Enable/Reset」、「Boot/Program」の順に放して書込モードにすること。

ESP-IDFを使う場合

基本的にはGet Started — ESP-IDF Programming Guide v3.2-dev-518-g020ade6 documentationに書いてあるとおり。ただし、一部追加あり。

  1. ツールチェインのインストール。僕はWindowsでの開発なので、Standard Setup of Toolchain for Windows — ESP-IDF Programming Guide v3.2-dev-518-g020ade6 documentation このページに従って、MSYSのパッケージをダンロードして利用。
  2. ~/esp/ を作成し、その中に移動して、ツールチェインを git clone --recursive https://github.com/espressif/esp-idf.git でインストールを実行。
  3. export IDF_PATH="C:/msys32/home/user-name/esp/esp-idf" でESP-IDFへのパスを設定。
  4. (追加作業) デフォルトのままだとpythonへのパスが通ってないので、 export PATH="$PATH:/mingw32/bin:/opt/xtensa-esp32-elf/bin" で追加でパスを通しておく。
  5. make menuconfigでシリアルポートを設定する場合はOSの設定に従うこと。

で、開発を楽にするためにVisual Studio Codeでビルド、書込を実行する方法が esp32-devenv-vscode/tutorial.md at master · VirgiliaBeatrice/esp32-devenv-vscode · GitHub で紹介されてた。プロジェクトごとに設定が必要になるけど、こちらのほうが楽っぽいような気はしてる。


追記