猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

Android

音声認識と音声合成(Text-To-Speech)

投稿日:2013年3月12日 更新日:

音声認識

音声認識で注意しなくてはいけないのは、何語で認識させるかです。
つまり英語として認識させるか、日本語として認識させるかです。
同じキャットと発音しても「cat」と「キャット」というように結果が変わってきます。

英語の場合はインテントに

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,Locale.ENGLISH.toString() );

日本語の場合には、

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,Locale.JAPAN.toString() );

として設定します。

startActivityForResultで呼び出し、
onActivityResultでintentから認識した結果を配列として受け取ります。

List<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

音声合成(Text-To-Speech)

アクティビティにimplements TextToSpeech.OnInitListenerを実装します。
onCreateでttsのインスタンスを作成します。
音声合成は読み上げるスピードを設定して、

tts.setSpeechRate(SPEECH_RATE_NORMAL);

読み上げるだけです。

tts.speak(word, TextToSpeech.QUEUE_FLUSH, null);

注意しなくてはいけないのは、事前に音声がインストールされているかどうかです。
設定 > 音声入出力 > 音声合成設定 > 音声データをインストール
を選択し、アンドロイドマーケットからSpeechSynthesis Dataをインストールしておきましょう。

音声がでないとだいぶ悩んでしまいました :x001:

サンプル

SpeechActivity.java

package com.nekotype.speech;

import java.util.List;
import java.util.Locale;

import com.nekotype.speach.R;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import android.widget.Toast;

public class SpeechActivity extends Activity implements TextToSpeech.OnInitListener {
    /** Called when the activity is first created. */
	
	 // TextToSpeechインスタンス
    private TextToSpeech tts = null;
    
    // 読み上げスピード用(標準)
    private static final float SPEECH_RATE_NORMAL = 1.0f;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btn = (Button)findViewById(R.id.button1);
        btn.setTag("音声認識");
        btn.setOnClickListener(new BtnListener());
        
        Button btn2 = (Button)findViewById(R.id.btnread);
        btn2.setTag("読む");
        btn2.setOnClickListener(new BtnListener());
        
        
        		// ttsのインスタンス作成
		tts = new TextToSpeech(this, this);
    }
    
    class BtnListener implements OnClickListener{

		public void onClick(View arg0) {
			// TODO 自動生成されたメソッド・スタブ
			Button button = (Button) arg0;
			
		
			if (button.getTag().equals("音声認識")) {
			
				try{
					
		            // 音声認識用インテント生成
		            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
		            
		            //LANGUAGE_MODEL_FREE_FORM 入力音声そのまま
		            //LANGUAGE_MODEL_WEB_SEARCH Web検索をかけて結果を取得
		            //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
		            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
		            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "popupの文字");
		            
		            //入力言語設定
		            //Locale.ENGLISH.toString() 英語
		            //Locale.ENGLISH.toString() 日本語
		            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,Locale.ENGLISH.toString() );
		            //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,Locale.JAPAN.toString() );
		            // インテント実行
		            startActivityForResult(intent, 0);
		        } catch (ActivityNotFoundException e) {
		            // 音声認識用インテントに対応するアクティビティが存在しない場合、
		            Toast.makeText(SpeechActivity.this,"音声認識できない!", Toast.LENGTH_LONG).show();
		        }
				
			}else if(button.getTag().equals("読む")){
				
			    String word = "";
				
			    //Toast.makeText(SpeachActivity.this,"yomu!", Toast.LENGTH_LONG).show();
				TextView tv = (TextView)findViewById(R.id.txtview1);
				word = (String) tv.getText();

                if (word.length() > 0) {
                    if (tts.isSpeaking()) {
                        tts.stop();
                    }
                    // 読み上げ開始
                    //読み上げスピード設定
                    tts.setSpeechRate(SPEECH_RATE_NORMAL);
                    //読み上げ
                    tts.speak(word, TextToSpeech.QUEUE_FLUSH, null);
                }
				
			}
			
		}
    	
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	
        // リクエストコードと結果コードチェック
        if (requestCode == 0 && resultCode == RESULT_OK) {
        	
            String resultsString = "";
            // 音声認識結果の文字列取得
            List<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            for (int i = 0; i < results.size(); i++) {
                resultsString += results.get(i);
            }
            // 取得した文字列をTextViewに設定
            TextView speakword = (TextView) findViewById(R.id.txtview1);
            speakword.setText(resultsString);
           
        }
        super.onActivityResult(requestCode, resultCode, data);

    }
    
	public void onInit(int status) {
		// TODO 自動生成されたメソッド・スタブ
        // 音声合成初期化処理が成功した場合
        if (TextToSpeech.SUCCESS == status) {
            // ロケールをENGLISHに設定
            Locale locale = Locale.ENGLISH;
            if (tts.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE) {
                tts.setLanguage(locale);
            } else {
                Log.e(getClass().getSimpleName(), "Locale Setting Error");
            }
        } else {
            Log.e(getClass().getSimpleName(), "TextToSpeech Init Error");
        }
	}
    
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="音声入力" />
    
    <TextView
        android:id="@+id/txtview1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         />
    
        <Button
        android:id="@+id/btnread"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="読む" />
</LinearLayout>

Gooleアドセンス用336

Gooleアドセンス用336

-Android
-

執筆者:

関連記事

SQLiteにPupSQLiteでアクセスする

PupSQLiteは任意の場所からダウンロードしてください。 PupSQLiteでなくてもエミュレーターからもデータベースファイルを抜き出すことができるので、それを利用して確認等が行えます。 まずはE …

エミュレーターのショートカット

エミュレーターによっては、メニューボタンがありません・・・ ショートカットを使用してメニューを表示させましょう :x002: メニューを表示させるにはF2ボタンでOK! マニュアルのリンク Emula …

Windows XPでAndroidのエミュレーターが起動しない

PANIC: Could not open AVD config file このエラーが表示されているのは、 C:\Documents and Settings\[ユーザー名]\.android\av …

インストールしているアプリを調べる

タイトルの通り、androidにインストールするアプリを調べてListViewに表示するサンプルです。 何かの役に立つかもしれません。 本当はSpeechSynthesis Dataがインストールされ …

Micro USB の充電用とデータ転送用

以前 「SonyEricssonXPERIA SO-01Bのドライバのインストール」 というものを書きました。 このどうしようもない端末は、MicroUSBにも問題があります。 しかもこの端末、古すぎ …