入力処理を行う IME アプリには、下記のような情報が保存されています。
- IME内のメニュを表示するための一般的な「漢字↔よみがな」の対応情報
- ユーザーが選択した変換の履歴に基づいた「漢字↔よみがな」の対応情報
上記の 1 と 2 の情報は、IME のデータベースで管理されます。このデータベースは、ユーザーの入力や IME の人工知能によって、改善されてゆきます。
つまり IME は「推測しにくい」よみがなを、ユーザーの文字入力によって、簡単に取得することができるように作られているのです。また、そのよみがなは、漢字の情報とともにデバイス上でデータベース化されます。
Q:その貴重なデータをアプリケーションと提供する方法はないのでしょうか?
A:はい!この記事を書いているのは日本語を利用する Android アプリ開発者の皆様にそれをご紹介するためです。Gboard で漢字の変換データをアプリと共有する API が利用可能になりました。
Figure 2: 漢字入力とともに、よみがな情報を提供するIME
この Gboard(v10.1 以降)に追加された API は、IME のテキスト出力に、よみがなを span として追加します。この API を利用するアプリケーションは、その出力を拾うことで、高い精度でユーザーの入力した文章に該当するよみがなを推測できるようになります。
よみがな情報を取得するためには、漢字入力の対象となる
TextEdit
が下記の条件を満たす必要があります:
- ア)
inputType
プロパティの値を textPersonName
にする。
- イ)
privateImeOptions
プロパティの値を com.google.android.inputmethod.latin.requestPhoneticOutput
にする。
Android Studio の Layout エディターで見た場合、設定は下記のようになります。
Figure 3: Android Studioのプロパティ設定
次に、
TextWatcher
を宣言し、入力通知の際、
CharSequence
から、
getSpans()
によって該当する
TtsSpan
を取得します。
public class MainActivity extends AppCompatActivity {
private class PhoneticRetriever implements TextWatcher {
// Extracts phonetic metadata from an incoming text blob
private String getPhoneticMetadata(CharSequence s) {
String phonetic = null;
if (s instanceof SpannableStringBuilder) {
SpannableStringBuilder textAsSpan = (SpannableStringBuilder) s;
TtsSpan[] allSpans = textAsSpan.getSpans(0, s.length(), TtsSpan.class);
if (allSpans.length == 1 && allSpans[0].getType().equals(TtsSpan.TYPE_TEXT)) {
// log shows where the span is in the text
Log.v("PHON",
s.toString() + " [" + textAsSpan.length() + "] start:" +
textAsSpan.getSpanStart(allSpans[0]) + " end:" +
textAsSpan.getSpanEnd(allSpans[0]));
phonetic = allSpans[0].getArgs().getString(TtsSpan.ARG_TEXT);
textAsSpan.removeSpan(allSpans[0]); // avoid consuming again
}
}
return phonetic;
}
@Override
public void afterTextChanged(Editable s) {
String sphonetic = getPhoneticMetadata(s);
if (sphonetic == null) {
// no phonetic data
} else {
// phonetic data is in sphonetic - use it as you like
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
EditText etUserInput = (EditText)findViewById(R.id.editTextPhoneticWithOptions );
etUserInput.addTextChangedListener(new PhoneticRetriever());
}
}
このサンプルコードでは、
afterTextChanged()
のコールバックで
TtsSpan
を取得しています。
TtsSpan.ARG_TEXT
がよみがなで、
getSpanStart()
と
getSpanEnd()
を利用すれば、入力された
CharSequence
の中で取得したよみがなの位置を取得することができます。
実行可能なコードはこちらのレポジトリをご参照ください。
→
https://github.com/googlesamples/gboard-dev-samples/tree/main/GetIMEPhoneticName
同じコードを使ったサンプルアプリケーションを Play Store からインストールすることも可能です。
→
https://play.google.com/store/apps/details?id=com.ragingsamples.getimephoneticname
Google コンタクト アプリ(v3.37 以降)では、連絡先を編集する際、この API を使って漢字名に該当するよみがなが自動入力されます。自動入力の結果が誤っている場合でも、ユーザーは手動でよみがなを直すことができます。
Figure 4: Google コンタクト アプリのよみがな推測
この API を利用して取得したよみがなの使い道はみなさんの作るアプリ次第ですが、いくつか参考になるユースケースをご紹介します:
- ユーザーの入力した名前から自動的によみがなを推測する。2021 年 5 月現在、この API は 名前にのみ対応しているため、ショッピング アプリや銀行アプリ、カスタム CRM アプリ、 SNS アプリなどで利用することができます。
- 他の IME が Gboard と同じ API を提供することで、より多くのユーザーによみがなのサポートを提供する。
ほかのユースケースのご提案、名前以外に将来的にサポートして欲しい入力タイプ、改善点などありましたら、ぜひフィードバックをお願いします。
Posted by
Alex Gimenez - Technical Solutions Consultant