Qpython 音声を認識させプログラムの処理に活用する

Androidでpythonを実行させることに試行錯誤しています。しかしこのくだりもようやく佳境に入ってきた気がします。

Qpythonで声を認識させるために必要な知識

これから書くことは私自身、情報を誤って解釈している可能性が間違いがあったときはご容赦ください。

必要となる知識は以下になります。

  • Qpythonは androidhelper モジュールを使うことにより、sl4aの android モジュールと同じメソッドが使える(認識をあやまっている可能性があります)
  • pythonにはspeachrecognitionというモジュールがあるがQpythonにおいてはこれを使う必要がない
  • speachrecognitionでマイクの音を拾う場合はpyaudioもインストールする必要がある。しかしQpythonの場合はandroidhelperモジュールですべてまかなえるため pyaudio をインストール必要はない

Qpythonとはpythonを実行できるAndroidアプリのことだ。幸いにもandroidhelperはなにもしなくても、importするだけですぐにつかえるようになっている。Android+pythonの世界にはじめ足を突っ込んだときは、いろいろ新しい用語などがでてきてわかりくいが、時とともにだんだん理解できてくる。

Qpythonで音声を拾う

Qpythonで音声を拾うというのは、実際にpythonプログラムを動作させ、スマートフォンに自ら話しかけることを意味する。

Qpythonで音声認識(自分がスマホにはなしかける)サンプルコード

import androidhelper
droid = androidhelper.Android()
myvoice = droid.recognizeSpeech()
print(myvoice) # result(id=1, result="", error="")
print(type(myvoice)) # <class 'androidhelper.sl4a.result'>
droid.makeToast(myvoice[1])

このプログラムを実行してみると、驚く。音声認識用のレイヤーが立ち上がるようになっている。
androidhelper-recognizespeach

このコードは、注意しなければならない点がある。droid.recognizeSpeech()で取得したものは文字列ではなく、androidhelper.sl4a.resultクラスのタプルになっているのである。そのためかえってきたテキストのみほしい場合は、タプルの[1]番目にアクセスする必要があるのである。

6行目に目を向けるとmyvoice[1]として、タプルの1番目にアクセスしている。タプルは0番目からはじまるので、result(結果)が格納されている1番目にアクセスする。

androidhelperの音声認識を応用する

このブログでもさんざん書いてきたが、sqlite3と連携して、音声で名前をよんで、その名前に対応した住所をグーグルマップのドライブモードで開くというプログラムを作ってみる。

import sqlite3, androidhelper
from pykakasi import kakasi

kakasi = kakasi()
kakasi.setMode("J", "K")
conv = kakasi.getConverter()

droid = androidhelper.Android()

conn = sqlite3.connect("database.sqlite")
c = conn.cursor()

while True:
    myvoice = droid.recognizeSpeech()
    droid.makeToast(myvoice[1])
    print("\n")
    key = input("your_voice text True? (y or otherkey): ")
    if key == "y":
        break;
    else:
        droid.makeToast("talk again!!")
        
myvoice = conv.do(myvoice[1])

select = "select * from users where name = '%s'" % myvoice
address = ""

for row in c.execute(select):
    address = row[2]
    break;
    
input("openbrowser? (please enter): ")
droid.view('https://www.google.com/maps/dir/?api=1&travelmode=driving&dir_action=navigate&destination=' + address)

conn.close()

データベースに登録されている人名は カタカナ であると想定した場合、pykakasiというモジュールを使って、音声入力で変換された漢字をカタカナにする必要がある。

ノンプログラマーのためエラー処理等がかけないので、音声入力で認識された文字が正しいかどうかは while文 で確認することにした。しかし確認のためのクッションが多すぎるのでもっと減らしてもよいかもしれない。

androidhelperの音声認識は実用的か?

androidhelperの音声認識は実用的か?という問いに関しては、まず音声認識の精度は問題ない。しかし音声認識用のレイヤーが出現するまでに数秒かかってしまう。これはモジュールの読み込みに時間がかかっているのではないかと思われるが詳細まではわからない。

しかし音声認識を使うことにより、文字をタップする回数を減らせるのはそこそこでかいのではないだろうか。

まとめ

今回紹介したのは、androidhelper recognizeSpeech()というメソッドで自分の声を認識させることができるものであったが、「録音」、「テキストの音声化」、「音量の調整」もpythonコードから扱うことができる。この記事の話はあくまでqpythonの話でありAndroidでpythonを実行することを想定している。パソコンの話ではないので注意されたい。

参考

ここに書くリンクはsl4aに関する情報が含まれているが、qpythonでimportするモジュールが違うだけでその他のコードは同じである。