和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;
}
}