分享

聊天机器人

 Dragon_chen 2016-10-28
用到了科大讯飞第三方平台的语音识别和语音合成API,进行机器人说话。
http://www./sdk/dispatcher提供下载SDK
http://www./doccenter/awd查看使用流程。
主要代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvList = (ListView) findViewById(R.id.lv_list);
mAdapter = new TalkAdapter();
lvList.setAdapter(mAdapter);
// 将“12345678”替换成您申请的APPID,申请地址:http://open.
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=54b8bca3");
}

private InitListener mInitListener = new InitListener() {

@Override
public void onInit(int arg0) {
System.out.println("初始化");
}
};

/**
* 开始语音识别
* @param view
*/
public void startVoice(View view) {
RecognizerDialog iatDialog = new RecognizerDialog(this, mInitListener);

iatDialog.setParameter(SpeechConstant.DOMAIN, "iat");
iatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
iatDialog.setParameter(SpeechConstant.ACCENT, "mandarin ");

iatDialog.setListener(recognizerDialogListener);
iatDialog.show();
}

private StringBuffer mTextBuffer = new StringBuffer();
private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {

@Override
public void onError(SpeechError arg0) {

}

@Override
public void onResult(RecognizerResult arg0, boolean isLast) {
if (isLast) {
String ask = mTextBuffer.toString();
mTextBuffer = new StringBuffer();// 清空StringBuffer的数据
System.out.println("最终语句:" + ask);

mTalkList.add(new TalkBean(ask, true, -1));

String answer = "没听清";
int imageId = -1;
if (ask.contains("你好")) {
answer = "你好呀!!!";
} else if (ask.contains("你是谁")) {
answer = "我是你的小助手!";
} else if (ask.contains("美女")) {
Random random = new Random();
int nextInt = random.nextInt(4);
answer = mnAnswerText[nextInt];
imageId = mnAnswerImage[nextInt];
} else if (ask.contains("天王盖地虎")) {
answer = "小鸡炖蘑菇";
imageId = R.drawable.m;
}

mTalkList.add(new TalkBean(answer, false, imageId));

mAdapter.notifyDataSetChanged();
lvList.setSelection(mAdapter.getCount());

speak(answer);
}
}
};

/**
* 机器人讲话
*/
private void speak(String answer) {
// 1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
SpeechSynthesizer mTts = SpeechSynthesizer
.createSynthesizer(this, null);
// 2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
mTts.setParameter(SpeechConstant.VOICE_NAME, "vixying");// 设置发音人
mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围0~100
// 设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
// 保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
// 如果不需要保存合成音频,注释该行代码
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
// 3.开始合成
mTts.startSpeaking(answer, null);
}

private TalkAdapter mAdapter;

/**
* 解析语音json数据
*/
private String parseJson(String json) {
Gson gson = new Gson();
VoiceBean bean = gson.fromJson(json, VoiceBean.class);
ArrayList<WsBean> ws = bean.ws;

StringBuffer sb = new StringBuffer();
for (WsBean wsBean : ws) {
ArrayList<CwBean> cw = wsBean.cw;
for (CwBean cwBean : cw) {
String w = cwBean.w;
sb.append(w);
}
}

System.out.println("解析数据为:" + sb.toString());
return sb.toString();
}

class TalkAdapter extends BaseAdapter {

@Override
public int getCount() {
return mTalkList.size();
}

@Override
public TalkBean getItem(int position) {
return mTalkList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(MainActivity.this,
R.layout.list_item, null);
holder = new ViewHolder();
holder.tvAsk = (TextView) convertView.findViewById(R.id.tv_ask);
holder.tvAnswer = (TextView) convertView
.findViewById(R.id.tv_answer);
holder.ivAnswer = (ImageView) convertView
.findViewById(R.id.iv_pic);
holder.llAnswer = (LinearLayout) convertView
.findViewById(R.id.ll_answer);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

TalkBean item = getItem(position);

if (item.isAsker) {// 是提问者
holder.llAnswer.setVisibility(View.GONE);
holder.tvAsk.setVisibility(View.VISIBLE);
holder.tvAsk.setText(item.text);
} else {// 是回答者
holder.llAnswer.setVisibility(View.VISIBLE);
holder.tvAsk.setVisibility(View.GONE);
holder.tvAnswer.setText(item.text);

if (item.imageId > 0) {// 如果图片存在
holder.ivAnswer.setVisibility(View.VISIBLE);
holder.ivAnswer.setImageResource(item.imageId);
} else {
holder.ivAnswer.setVisibility(View.GONE);
}
}

return convertView;
}
}

public class ViewHolder {
public TextView tvAsk;
public TextView tvAnswer;
public ImageView ivAnswer;
public LinearLayout llAnswer;
}
}
//保存问答的对象。
public class TalkBean {

public String text;// 问答语句
public boolean isAsker;// 表示是否是提问者, 否则是回答者
public int imageId = -1;

public TalkBean(String text, boolean isAsker, int imageId) {
super();
this.text = text;
this.isAsker = isAsker;
this.imageId = imageId;
}
}
//语音识别数据对象,因为其结果使用Json封装的,所以需要解析合成句子。
public class VoiceBean {

public int bg;
public int ed;
public boolean ls;
public int sn;
ArrayList<WsBean> ws;

public class WsBean {
public int bg;
public ArrayList<CwBean> cw;
}

public class CwBean {
public String sc;
public String w;
}
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约