`
liming1022
  • 浏览: 8080 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

讯飞语音识别

 
阅读更多

和QQ微信语音聊天的功能差不多,模仿一个微信聊天页面,可以进行语音通话,然后根据说的话进行不同的回复,例如你说的话里带美女,两个字,就会回复你一张美女的照片,你说的话里带唐诗,就可以回复你一首唐诗,并且可以语音说出来。

附下如下代码,需要导入安徽科大讯飞的语音识别的jar包,并且做一些初始化。

1.mainActivity的代码,实现了语音识别,语音说话等

package com.example;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.Scroller;

import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechConfig.RATE;
import com.iflytek.speech.SpeechError;
import com.iflytek.speech.SynthesizerPlayer;
import com.iflytek.speech.SynthesizerPlayerListener;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;

/**
 * 语音识别的小demo,可以根据说的话发送不同的东西
 * @author liming
 *
 */
public class MainActivity extends Activity implements RecognizerDialogListener, OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		initView();
		initClass();
	}

	private void initClass() {
		view = new UpdateView(this,scrolllayout);
	}

	private void initView() {
		//initPlayer();
		Button voice_start = (Button) findViewById(R.id.voice_start);
		voice_start.setOnClickListener(this);
		scrolllayout = (ScrollView) findViewById(R.id.scolllayout);
		
	}

	public void initPlayer(String result) {
		SynthesizerPlayer player  = SynthesizerPlayer.createSynthesizerPlayer(this, "appid=5212ef0a");
		player.playText(result , null, new SynthesizerPlayerListener() {
			
			@Override
			public void onPlayResumed() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onPlayPercent(int arg0, int arg1, int arg2) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onPlayPaused() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onPlayBegin() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onEnd(SpeechError arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onBufferPercent(int arg0, int arg1, int arg2) {
				// TODO Auto-generated method stub
				
			}
		});
		player.setSampleRate(RATE.rate16k);
		player.setVolume(100);
		player.setBackgroundSound(null);
		player.setSpeed(50);
		player.setVoiceName("vixr");
	}

//	public void click(View view) {
//	
//	}
	public void initDialog(){
		RecognizerDialog dialog = new RecognizerDialog(this, "appid=5212ef0a");
		dialog.setListener(this);
		// 设置采样率
		dialog.setSampleRate(RATE.rate16k);
		dialog.show();
	}
	

	private StringBuffer sb = new StringBuffer();
	private ScrollView scrolllayout;
	private UpdateView view;

	@Override
	public void onEnd(SpeechError error) {
		if(error == null){
			System.out.println(sb.toString());
			view.update(sb.toString());
			MyAsyncTask task = new MyAsyncTask(sb.toString(),this,scrolllayout,view);
			
		}
		sb.setLength(0);
	}

	@Override
	public void onResults(ArrayList<RecognizerResult> results, boolean arg1) {
		if (results != null) {
			for (RecognizerResult result : results) {
				sb.append(result.text);
			}
		}
	}

	@Override
	public void onClick(View v) {
		initDialog();
		
	}

}

 2.这个是进行更新View的类负责把说的话更新到view上去.

package com.example;

import java.util.Random;

import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class UpdateView {

	private MainActivity mainActivity;
	private ScrollView scrolllayout;
	private String result;
	private LinearLayout base_layout;

	public UpdateView(MainActivity mainActivity, ScrollView scrolllayout) {
		this.mainActivity = mainActivity;
		this.scrolllayout = scrolllayout;
		base_layout = (LinearLayout) scrolllayout
				.findViewById(R.id.base_layout);
	}

	public void update(String result) {

		this.result = result;

		View view = View.inflate(mainActivity, R.layout.list_say_me_item, null);
		TextView message = (TextView) view
				.findViewById(R.id.messagedetail_row_text);
		message.setText(result);
		TextView date = (TextView) view
				.findViewById(R.id.messagedetail_row_date);
		date.setText(CommonUtil.getStringDate());
		base_layout.addView(view);
		mainActivity.initPlayer(result);

		scrolllayout.post(new Runnable() {

			@Override
			public void run() {
				scrolllayout.fullScroll(ScrollView.FOCUS_DOWN);
			}
		});

	}

	public void updateMM(Answer result, String texts) {
		View view = View.inflate(mainActivity, R.layout.list_say_she_mm_item,
				null);
		ImageView image = (ImageView) view.findViewById(R.id.image_mm);
		if (result != null) {
			image.setImageResource(result.getMm());
		}
		TextView text = (TextView) view
				.findViewById(R.id.messagedetail_row_text);
		text.setText(texts);
		base_layout.addView(view);
		mainActivity.initPlayer(texts);
		scrolllayout.post(new Runnable() {

			@Override
			public void run() {
				scrolllayout.fullScroll(ScrollView.FOCUS_DOWN);
			}
		});

	}

}

 3.这是异步加载数据的类,放在子线程中执行。

package com.example;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.os.AsyncTask;
import android.widget.ScrollView;

public class MyAsyncTask {

	private String result;
	private MainActivity mainActivity;
	private ScrollView scrolllayout;
	private UpdateView updateView;
	public MyAsyncTask(String result,MainActivity mainActivity,ScrollView scrolllayout,UpdateView updateView) {
		this.result = result;
		this.mainActivity = mainActivity;
		this.scrolllayout = scrolllayout;
		this.updateView = updateView;
		new QueryAsyncTask().execute(result);
	}
	
	private class QueryAsyncTask extends AsyncTask<String, Void, Answer>{

		@Override
		protected Answer doInBackground(String... params) {
			String str = params[0]; 
			Answer answer = getMMPic(str);
			return answer;
		}

		@Override
		protected void onPostExecute(Answer result) {
			super.onPostExecute(result);
			if(result != null){ 
				if(Answer.MM_TYPE == result.getType()){
					String[] texts = mainActivity.getResources().getStringArray(R.array.mm);
					Random rand = new Random();
					int index = rand.nextInt(texts.length);
					updateView.updateMM(result,texts[index]);
				}else if(Answer.POETREY_TYPE == result.getType()){
					String[] texts = mainActivity.getResources().getStringArray(R.array.tang_poetry);
					Random rand = new Random();
					int index = rand.nextInt(texts.length);
					updateView.updateMM(result,texts[index]);
				}
			}
		}
		
		

		
	}

	public Answer getMMPic(String str) {
		if(str.contains("美女") || str.contains("妹子")){
			int mm = initPic();
			Answer answer = new Answer();
			answer.setMm(mm);
			answer.setType(Answer.MM_TYPE);
			return answer;
		}else if(str.contains("唐诗")){
			Answer answer = new Answer();
			answer.setType(Answer.POETREY_TYPE);
			return answer;
		}
		return null;
	}

	private int initPic() {
		List<Integer> list = new ArrayList<Integer>();
		list.add(R.drawable.mm0);
		list.add(R.drawable.mm1);
		list.add(R.drawable.mm2);
		list.add(R.drawable.mm13);
		list.add(R.drawable.mm12);
		list.add(R.drawable.mm15);
		list.add(R.drawable.mm16);
		Random rand = new Random();
		
		return list.get(rand.nextInt(list.size()));
	}

}

 4,算是一个javaBean,将获得到的数据封装到这个Bean中

package com.example;

public class Answer {

	public static final int MM_TYPE = 1;
	public static final int POETREY_TYPE = 2;
	private int mm;
	private int type;
	public int getMm() {
		return mm;
	}
	public void setMm(int mm) {
		this.mm = mm;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	
	
}

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics