用到了科大讯飞第三方平台的语音识别和语音合成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; } } |
|
来自: Dragon_chen > 《Android》