Log in



入力した文字列を合成音声で読み上げる

Thursday, November 1st, 2012 by

合成音声を使用するためには、音声データがAndroidにインストールされていなければなりません。
インストール方法は、設定>音声入出力>テキスト読み上げの設定>音声データをインストール です。
「音声データをインストール」の項目が灰色になっていればインストール済み、なっていなければインストールされていない状態です。
また、Androidのversionによってはデフォルトでインストールされており、項目そのものが存在しない場合もあります。(4.0.3と4.1で確認)

アプリケーションで合成音声を使用するには、TextToSpeechクラスを使用します。
以下の手順で記述します。

1.オブジェクトの生成(初期化)
2.言語の設定
3.読み上げる文章を指定してspeakメソッドを呼び出す

アプリケーションを終了する時には、忘れずにリソースの破棄を行います。また、音声の速度や声の高さも変更することが出来ます。

オブジェクトの生成(初期化)
コンストラクタにコンテキストと初期化完了のリスナ(TextToSpeech.OnInitListener)を指定します。

TextToSpeech(Context context, TextToSpeech.OnInitListener listener)

onInitメソッドをオーバーライドして初期化完了のイベントを受け取ります。

void onInit(int status)

statusは成功の場合:TextToSpeech.SUCCESSが、失敗の場合:TextToSpeech.ERRORが渡されます。

言語(ロケール)の設定
初期化が成功した場合、次にロケールの設定を行います。

まず、isLanguageAvailableメソッドで任意のロケールが利用可能か確認します。

int isLanguageAvailable(Locale locale)

戻り値がTextToSpeech.LANG?AVAILABLE 以上の値であれば利用可能ですので、setLanguageメソッドでロケールを設定します。

int setLanguage(Locale locale)

こちらの戻り値もisLanguageAvailableと同様に利用可能かどうかの値が返ってきます。

テキストの読み上げを行うには、以下のメソッドを呼び出します。

int speak(String text, int queueMode, HashMap<String,String> params)

キューモードは以下の通りです。

TextToSpeech.QUEUE_ADD:再生キューへエントリを追加
TextToSpeech.QUEUE_FLUSH:再生待ちのエントリをドロップしてエントリを実行

パラメータは実行後に呼びされるメソッドの引数に渡す値などが設定できますが、不要であればnullを指定することも可能です。

以下、ソースのサンプルです。今回はEditTextに入力された文字列を合成音声で読み上げる内容になっています。
また、ロケールにはENGLISHを指定していますが、残念ながら日本語には対応していないようです。(ローマ字で日本語を入力すれば、不自然ながらも一応読み上げてはくれます)

public class MainActivity extends Activity implements View.OnClickListener, TextToSpeech.OnInitListener{


    final private Float SPEECH_SLOW = 0.5f;
    final private Float SPEECH_NORMAL = 1.0f;
    final private Float SPEECH_FAST = 1.5f;
    final private Float PITCH_LOW = 0.5f;
    final private Float PITCH_NORMAL = 1.0f;
    final private Float PITCH_HIGH = 1.5f;
    private TextToSpeech    tts;
    private Button buttonSpeech;
    private Button buttonSlow;
    private Button buttonNormal;
    private Button buttonFast;
    private Button buttonLowPitch;
    private Button buttonNormalPitch;
    private Button buttonHighPitch;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

     // ボタンのClickListenerの登録
        buttonSpeech = (Button)findViewById(R.id.ButtonSpeech);
        buttonSpeech.setOnClickListener(this);
        buttonSlow = (Button)findViewById(R.id.ButtonSlow);
        buttonSlow.setOnClickListener(this);
        buttonNormal = (Button)findViewById(R.id.ButtonNormal);
        buttonNormal.setOnClickListener(this);
        buttonFast = (Button)findViewById(R.id.ButtonFast);
        buttonFast.setOnClickListener(this);
        buttonLowPitch = (Button)findViewById(R.id.ButtonLowPitch);
        buttonLowPitch.setOnClickListener(this);
        buttonNormalPitch = (Button)findViewById(R.id.ButtonNormalPitch);
        buttonNormalPitch.setOnClickListener(this);
        buttonHighPitch = (Button)findViewById(R.id.ButtonHighPitch);
        buttonHighPitch.setOnClickListener(this);

     // TextToSpeechオブジェクトの生成
        tts = new TextToSpeech(this, this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != tts) {
            // TextToSpeechのリソースを解放する
            tts.shutdown();
        }
    }

    @Override
    public void onInit(int status) {
        if (TextToSpeech.SUCCESS == status) {
            Locale locale = Locale.ENGLISH;
            if (tts.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE) {
                tts.setLanguage(locale);
            } else {
                Log.d("", "Error SetLocale");
            }
        } else {
            Log.d("", "Error Init");
        }
    }

    private void speechText() {
        String string = ((EditText)findViewById(R.id.EditTextSpeech)).getText().toString();
        if (0 < string.length()) {
            if (tts.isSpeaking()) {
                // 読み上げ中なら止める
                tts.stop();
            }

            // 読み上げ開始
            tts.speak(string, TextToSpeech.QUEUE_FLUSH, null);
        }
    }

    @Override
    public void onClick(View v) {
        if (buttonSpeech == v) {
            speechText();
        } else if (buttonSlow == v) {
            // 再生速度の設定
            tts.setSpeechRate(SPEECH_SLOW);
        } else if (buttonNormal == v) {
            // 再生速度の設定
            tts.setSpeechRate(SPEECH_NORMAL);
        } else if (buttonFast == v) {
            // 再生速度の設定
            tts.setSpeechRate(SPEECH_FAST);
        } else if (buttonLowPitch == v) {
            // 再生ピッチの設定
            tts.setPitch(PITCH_LOW);
        } else if (buttonNormalPitch == v) {
            // 再生ピッチの設定
            tts.setPitch(PITCH_NORMAL);
        } else if (buttonHighPitch == v) {
            // 再生ピッチの設定
            tts.setPitch(PITCH_HIGH);
        }
    }


}

Leave a Reply