Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Android4.0だとテキスト読みあげサービスを差し替えられる!?

こんにちは。kimukimuです。

折角Android4.0のSDKが公開されたので、
Googleで公開されているサンプルを動かしてみます!

と、ただその前に最近のAndroidニュースを。

1.最近のAndroidニュース

正直な話、Android4.0登場が大きすぎて他のAndroidニュースは霞んでいます^^;
ですが、面白いな、と思ったのは下記です。

ソニー・エリクソンは2011年発売したXperiaシリーズにAndroid4.0を提供予定

今年登場したXperiaシリーズ。。。Xperia Arc、Xperia Acroとかでしょうか。
に、Android4.0が提供されるとのことです。

GoogleもNexus SにAndroid4.0を提供予定と発表し、
「Android2.3が動く機体であれば、Android4.0は動作可能」とコメントしています。

もしかすると、来年は今年発売されたAndroid2.3スマートフォン
Android4.0へのバージョンアップラッシュが来るのかもしれませんね。

2.Android4.0用のサンプルプロジェクト一覧

Android Developerサイトのサンプルコードを確認してみると、
新しいサンプルプロジェクトは下記でした。

Android Beam Demo(NFCを使った情報通信デモ)
Spell Checker(入力時のスペルチェック)
Voicemail Provider(ボイスメール作成)
Wi-Fi Direct Demo(Wi-Fi Directデモ)
Text To Speech Engine(テキスト読みあげサービス差し替え)

Android Beamや、Wi-Fi Directは実機(Galaxy Nexus)がないと出来そうにないですね。。。
なので、エミュレータで確認できそうなText To Speech Engineを確認することにします。

3.Androidプロジェクトの中身を確認してみます

では、早速新しいAndroidプロジェクトを作成し、そこにサンプルコードの中身を落とし込みます。
尚、ここではソースの抜粋しか紹介しないため、実際のファイルはこちらで。TextSpeech.zip 直

プロジェクトのAndroidSDKバージョンは当然4.0で作成します。

マニフェストファイルは下記の通りです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.gr.t3.android.textspeech"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- ★Android4.0を利用している宣言★ -->
    <uses-sdk android:minSdkVersion="14" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:label="@string/app_name"
            android:name=".RobotSpeakTtsService" >
            <intent-filter >
                <!-- ★テキスト読みあげサービスとしてインストールする宣言★ -->
                <action android:name="android.intent.action.TTS_SERVICE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data
                android:name="android.speech.tts"
                android:resource="@xml/tts_engine" />
        </service>
        <!-- ★画面を持たない=単体アプリとして起動できない事を宣言★ -->
        <activity
            android:name=".CheckVoiceData"
            android:theme="@android:style/Theme.NoDisplay" >
            <intent-filter >
                <action android:name="android.speech.tts.engine.CHECK_TTS_DATA" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

今回は特定の画面を持つアプリではなく、
Androidの既存のサービスを差し替える」目的のアプリになります。
そのため、メインの画面は持たずに、差し替えるための定義としてインストールする形になります。

テキスト読みあげを実際に行っている箇所は下記のようです。

RobotSpeakTtsService.java
  protected synchronized void onSynthesizeText(SynthesisRequest request,
      SynthesisCallback callback) {
    int load = onLoadLanguage(request.getLanguage(), request.getCountry(),
        request.getVariant());

    // 言語サポート確認
    if (load == TextToSpeech.LANG_NOT_SUPPORTED) {
      callback.error();
      return;
    }

    // 16bit PCM monoオーディオとしてコールバックを生成
    callback.start(SAMPLING_RATE_HZ, AudioFormat.ENCODING_PCM_16BIT, 1);

    // 1文字ごとに読みあげを行う
    final String text = request.getText().toLowerCase();
    for (int i = 0; i < text.length(); ++i) {
      char value = normalize(text.charAt(i));

      // 文字読みあげを行う(オーディオデータのバイト配列から該当部分を読み出す)
      if (!generateOneSecondOfAudio(value, callback)) {
        callback.error();
        return;
      }
    }

    // 読みあげ完了
    callback.done();
  }

他の個所も読んだところ、大まかな流れは下記のようになっていました。

1.オーディオ定義ファイル(*.freq)を読み出す
2.テキスト読みあげコールバックをスタート
3.1文字ごとに小文字に変換し、コールバックにオーディオデータとインデックスを渡す
4.要求された文字数分「3」を繰り返す

そんなわけで、オーディオ定義ファイルの中身を確認してみたところ、下記のようになっていました。

eng-USA.freq(英語音声読み上げ定義ファイル。。。と思われる)
a:2
b:4
c:8
d:16
e:32
f:64
g:128
h:160
i:320
j:400
k:640
l:800
m:1600
n:3200
o:4000
p:8000
q:20
r:40
s:80
t:125
u:250
v:500
w:1000
x:2000
y:5
z:10

オーディオデータの定義のはずなんですが、中身はさっぱりです。
これでどうやって音声を表現できるんだろう。。。。

ともあれ、気にしていても仕方ないため、実際にインストールしてみます。

4.実際に動かしてみると・・・?

では、実際にインストールしてみます。
インストールの手順はこれまでのAndroidと同じです。

インストールしても、単体で起動できないアプリのため、特に画面は切り替わりません。
まずは、アプリ一覧を表示します。

アプリ一覧画面から設定画面を表示します。

設定画面から、言語設定のメニューを表示します。

テキスト読みあげメニューを選択します。

今回インストールしたアプリが「TextToSpeechEngine」として
表示されているため、使用するエンジンをアプリのものに変更します。

では、サンプル読みあげを聞いてみます。すると・・・?

・・・・!?
えーと、何でしょうか。

ファミコン時代のチープな音と、
モデムの「ピーガーガー」の音が混ざったような音が流れます。。。。

とりあえず、差し替えは出来たものの、実際に意味のある
読みあげとするにはきちんとしたデータ設定が必要なようです。。。

5.何が嬉しいの?

データがきちんと設定できたなら、の前提で書きます。

言うまでもなく、Androidのテキスト読みあげの音声を
自分の好みに差し替えられるということですね!

例えば・・・
・・・
・・・
・・・

とりあえず、普通に書いて公開できないようなイメージばかり浮かんだので詳細は割愛します。
ともあれ、読みあげエンジンを自分で設定できるのは面白いですね。

より自分好みの端末に出来るよう仕上がっているみたいです。Android4.0は。