zoukankan      html  css  js  c++  java
  • Android语音识别

    语音识别

    科大讯飞 开放平台 http://open.voicecloud.cn/

    需要拷贝lib、assets、并在清单文件中写一些权限
    public class MainActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		// 初始化语音引擎
    		SpeechUtility.createUtility(this, SpeechConstant.APPID + "=54b8bca3");
    	}
    	/**
    	 * 开始听写
    	 * 
    	 * @param view
    	 */
    	public void listen(View view) {
    		// 1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
    		SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);
    		// 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
    		mIat.setParameter(SpeechConstant.DOMAIN, "iat");
    		mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
    		mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
    		// 开始听写
    		mIat.startListening(mRecoListener);
    	}
    	/**
    	 * 交互动画
    	 * 
    	 * @param view
    	 */
    	public void listenUI(View view) {
    		RecognizerDialog iatDialog = new RecognizerDialog(this, mInitListener);
    		// 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
    		iatDialog.setParameter(SpeechConstant.DOMAIN, "iat");
    		iatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
    		iatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
    		iatDialog.setListener(recognizerDialogListener);
    		iatDialog.show();
    	}
    	/**
    	 * 语音朗诵
    	 */
    	public void read(View view) {
    		SpeechSynthesizer mTts = SpeechSynthesizer
    				.createSynthesizer(this, null);
    		mTts.setParameter(SpeechConstant.VOICE_NAME, "vixm");
    		mTts.setParameter(SpeechConstant.SPEED, "50");
    		mTts.setParameter(SpeechConstant.VOLUME, "80");
    		mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
    		mTts.startSpeaking("床前明月光,地上鞋两双,床上狗男女,其中就有你! 你好啊?",
    				mSynthesizerListener);
    	}
    	private SynthesizerListener mSynthesizerListener = new SynthesizerListener() {
    		@Override
    		public void onSpeakResumed() {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onSpeakProgress(int arg0, int arg1, int arg2) {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onSpeakPaused() {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onSpeakBegin() {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onCompleted(SpeechError arg0) {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {
    			// TODO Auto-generated method stub
    		}
    	};
    	private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {
    		@Override
    		public void onResult(RecognizerResult results, boolean isLast) {
    			System.out.println(results.getResultString());
    			System.out.println("isLast=" + isLast);
    		}
    		@Override
    		public void onError(SpeechError arg0) {
    		}
    	};
    	private InitListener mInitListener = new InitListener() {
    		@Override
    		public void onInit(int arg0) {
    		}
    	};
    	private RecognizerListener mRecoListener = new RecognizerListener() {
    		/**
    		 * 语音识别结果 isLast=true表示会话结束
    		 */
    		@Override
    		public void onResult(RecognizerResult results, boolean isLast) {
    			System.out.println(results.getResultString());
    		}
    		@Override
    		public void onBeginOfSpeech() {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onEndOfSpeech() {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onError(SpeechError arg0) {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
    			// TODO Auto-generated method stub
    		}
    		@Override
    		public void onVolumeChanged(int arg0) {
    			// TODO Auto-generated method stub
    		}
    	};
    }
    

      



    聊天机器人
    1.主布局
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <ListView
            android:id="@+id/lv_list"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:divider="@null"
            android:layout_weight="1" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bottom_bar"
            android:gravity="center"
            android:orientation="vertical" >
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:background="@drawable/btn_selector"
                android:onClick="startListen"
                android:text="点击开始语音识别"
                android:textColor="#000"
                android:textSize="16sp" />
        </LinearLayout>
    </LinearLayout>
    

      

    2.子布局
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/tv_ask"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_margin="5dp"
            android:background="@drawable/asker_bubble"
            android:gravity="center"
            android:text="你吃饭了吗?"
            android:textColor="#000"
            android:textSize="16sp" />
        <LinearLayout
            android:id="@+id/ll_answer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_ask"
            android:layout_margin="5dp"
            android:background="@drawable/answer_bubble"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/tv_answer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="吃个毛线啊!"
                android:textColor="#000"
                android:textSize="16sp" />
            <ImageView
                android:id="@+id/iv_pic"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/m"
                android:visibility="gone" />
        </LinearLayout>
    </RelativeLayout>
    

      

    3.代码
    聊天信息对象
    public class ChatBean {
    	public String text;// 内容
    	public boolean isAsker;// true表示提问者,否则是回答者
    	public int imageId = -1;// 图片id
    	public ChatBean(String text, boolean isAsker, int imageId) {
    		this.text = text;
    		this.isAsker = isAsker;
    		this.imageId = imageId;
    	}
    }
    

      

    语音信息封装类(需要解析json数据)
    1. public class VoiceBean {
      	public ArrayList<WSBean> ws;
      	public class WSBean {
      		public ArrayList<CWBean> cw;
      	}
      	public class CWBean {
      		public String w;
      	}
      }
    mainactivity:
    public class MainActivity extends Activity {
    	private ListView lvList;
    	private ArrayList<ChatBean> mChatList = new ArrayList<ChatBean>();
    	private ChatAdapter mAdapter;
    	private String[] mMMAnswers = new String[] { "约吗?", "讨厌!", "不要再要了!",
    			"这是最后一张了!", "漂亮吧?" };
    	private int[] mMMImageIDs = new int[] { R.drawable.p1, R.drawable.p2,
    			R.drawable.p3, R.drawable.p4 };
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		lvList = (ListView) findViewById(R.id.lv_list);
    		mAdapter = new ChatAdapter();
    		lvList.setAdapter(mAdapter);
    		// 初始化语音引擎
    		SpeechUtility.createUtility(this, SpeechConstant.APPID + "=54b8bca3");
    	}
    	StringBuffer mTextBuffer = new StringBuffer();
    	private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {
    		@Override
    		public void onResult(RecognizerResult results, boolean isLast) {
    			// System.out.println(results.getResultString());
    			// System.out.println("isLast=" + isLast);
    			String text = parseData(results.getResultString());
    			mTextBuffer.append(text);
    			if (isLast) {// 会话结束
    				String finalText = mTextBuffer.toString();
    				mTextBuffer = new StringBuffer();// 清理buffer
    				System.out.println("最终结果:" + finalText);
    				mChatList.add(new ChatBean(finalText, true, -1));
    				String answer = "没听清";
    				int imageId = -1;
    				if (finalText.contains("你好")) {
    					answer = "大家好,才是真的好!";
    				} else if (finalText.contains("你是谁")) {
    					answer = "我是你的小助手!";
    				} else if (finalText.contains("天王盖地虎")) {
    					answer = "小鸡炖蘑菇";
    					imageId = R.drawable.m;
    				} else if (finalText.contains("美女")) {
    					Random random = new Random();
    					int i = random.nextInt(mMMAnswers.length);
    					int j = random.nextInt(mMMImageIDs.length);
    					answer = mMMAnswers[i];
    					imageId = mMMImageIDs[j];
    				}
    				mChatList.add(new ChatBean(answer, false, imageId));// 添加回答数据
    				mAdapter.notifyDataSetChanged();// 刷新listview
    				
    				lvList.setSelection(mChatList.size() - 1);// 定位到最后一张
    				read(answer);
    			}
    		}
    		@Override
    		public void onError(SpeechError arg0) {
    		}
    	};
    	/**
    	 * 语音朗诵
    	 */
    	public void read(String text) {
    		SpeechSynthesizer mTts = SpeechSynthesizer
    				.createSynthesizer(this, null);
    		mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
    		mTts.setParameter(SpeechConstant.SPEED, "50");
    		mTts.setParameter(SpeechConstant.VOLUME, "80");
    		mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
    		mTts.startSpeaking(text, null);
    	}
    	/**
    	 * 开始语音识别
    	 * 
    	 * @param view
    	 */
    	public void startListen(View view) {
    		RecognizerDialog iatDialog = new RecognizerDialog(this, null);
    		// 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
    		iatDialog.setParameter(SpeechConstant.DOMAIN, "iat");
    		iatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
    		iatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
    		iatDialog.setListener(recognizerDialogListener);
    		iatDialog.show();
    	}
    	class ChatAdapter extends BaseAdapter {
    		@Override
    		public int getCount() {
    			return mChatList.size();
    		}
    		@Override
    		public ChatBean getItem(int position) {
    			return mChatList.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) {
    				holder = new ViewHolder();
    				convertView = View.inflate(MainActivity.this,
    						R.layout.list_item, null);
    				holder.tvAsk = (TextView) convertView.findViewById(R.id.tv_ask);
    				holder.tvAnswer = (TextView) convertView
    						.findViewById(R.id.tv_answer);
    				holder.llAnswer = (LinearLayout) convertView
    						.findViewById(R.id.ll_answer);
    				holder.ivPic = (ImageView) convertView
    						.findViewById(R.id.iv_pic);
    				convertView.setTag(holder);
    			} else {
    				holder = (ViewHolder) convertView.getTag();
    			}
    			ChatBean item = getItem(position);
    			if (item.isAsker) {// 是提问者
    				holder.tvAsk.setVisibility(View.VISIBLE);
    				holder.llAnswer.setVisibility(View.GONE);
    				holder.tvAsk.setText(item.text);
    			} else {
    				holder.tvAsk.setVisibility(View.GONE);
    				holder.llAnswer.setVisibility(View.VISIBLE);
    				holder.tvAnswer.setText(item.text);
    				if (item.imageId != -1) {// 有图片
    					holder.ivPic.setVisibility(View.VISIBLE);
    					holder.ivPic.setImageResource(item.imageId);
    				} else {
    					holder.ivPic.setVisibility(View.GONE);
    				}
    			}
    			return convertView;
    		}
    	}
    	static class ViewHolder {
    		public TextView tvAsk;
    		public TextView tvAnswer;
    		public LinearLayout llAnswer;
    		public ImageView ivPic;
    	}
    	/**
    	 * 解析语音数据
    	 * 
    	 * @param resultString
    	 */
    	protected String parseData(String resultString) {
    		Gson gson = new Gson();
    		VoiceBean bean = gson.fromJson(resultString, VoiceBean.class);
    		ArrayList<WSBean> ws = bean.ws;
    		StringBuffer sb = new StringBuffer();
    		for (WSBean wsBean : ws) {
    			String text = wsBean.cw.get(0).w;
    			sb.append(text);
    		}
    		return sb.toString();
    	}
    }
  • 相关阅读:
    Redis笔记 —— string 篇
    解决跨域请求无法携带Cookie的问题
    Mysql事务学习笔记
    Redis笔记 —— hash 篇
    mysql视图的简单学习
    axios无法被识别为ajax请求的解决方案
    常见header信息详解
    int 15h
    操作系统有进程了
    是时候走我自己的路线了,真正的做我自己的Jinux
  • 原文地址:https://www.cnblogs.com/sixrain/p/4919365.html
Copyright © 2011-2022 走看看