前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android语音识别

Android语音识别

作者头像
六月的雨
发布于 2022-01-12 06:27:10
发布于 2022-01-12 06:27:10
8K00
代码可运行
举报
文章被收录于专栏:Android开发指南Android开发指南
运行总次数:0
代码可运行

语音识别 - 科大讯飞 开放平台 http://open.voicecloud.cn/

需要拷贝lib、assets、并在清单文件中写一些权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.主布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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.子布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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.代码

聊天信息对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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数据)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class VoiceBean {
    public ArrayList<WSBean> ws;
    public class WSBean {
        public ArrayList<CWBean> cw;
    }
    public class CWBean {
        public String w;
    }
}
 

mainactivity:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 天气APP(三十三)语音播报
  在这篇文章中我将给天气APP加入语音功能,首当其冲的就是这个语音播报功能。语音使用了第三方SDK,做语音开发不可能不知道讯飞,因此我这里用的也是讯飞的SDK,下面开始吧。
晨曦_LLW
2021/03/02
1.6K0
Android 天气APP(三十三)语音播报
Android学习Tabhost、gallery、listview、imageswitcher
Tabhost控件又称分页控件,在很多的开发语言中都存在。它可以拥有多个标签页,每个标签页可以拥有不同的内容。android中,一个标签页可以放 一个view或者一个activity。TabHost是标签控件类的核心类,也是标签的集合。 1.tabhost定义 android控件中有封装好的tab控件,直接拖一个到xml文件中。下面的代码都是tab控件自己生成的。 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and
水击三千
2018/02/27
1.3K0
Android学习Tabhost、gallery、listview、imageswitcher
画廊视图Gallery
幻灯片图片浏览器 1.布局 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientatio
欢醉
2018/01/22
9870
画廊视图Gallery
9.indicate、xutils、json
json数据  页签详情页数据 public class TabData { public int retcode; public TabDetail data;//不是数组的话类型就是这个 public class TabDetail { public String title; public String more; public ArrayList<TabNewsData> news; public ArrayList<TopNewsData> topnews; @Override pu
六月的雨
2018/05/14
6860
android开发列表界面
android开发列表界面,上边是一个显示题目,下边显示的是图标,中间显示的是列表。 看一下效果吧 当鼠标点击上之后出现背景图,下面看一下如何做出这样的效果吧。 1.创建android工程 修改ma
cloudskyme
2018/03/20
1.4K0
android开发列表界面
10.下拉刷新、加载更多、标记已读、轮播条、缓存
getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用
六月的雨
2022/01/12
8710
10.下拉刷新、加载更多、标记已读、轮播条、缓存
【Android源码解析】选择多张图片上传多图预览
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47731439
Hankkin
2018/09/06
3.7K0
android ListView 嵌套 ListView
看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失的方法,指导下我,比较奇怪的时候刚开始初始化的时候子listview是默认不显示的,当点击父listview去张开子listview,父listview应该会再次刷新,但子listview展开是可以的,然后下一次更新数据源的时候子listview又会自动关闭,我猜应该是在刷新子listview的时候,父listview先更新完成,子listview的高度测量就没有对!
全栈程序员站长
2022/09/13
1.5K0
android ListView 嵌套 ListView
Andriod基础——Adapter类
Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View,因为layout五花八门,很多数据都不能直接绑定上去,所以Android引入了Adapte
mukekeheart
2018/02/27
1.7K0
Andriod基础——Adapter类
Android 垃圾分类APP(三)垃圾分类之语音输入
  上一篇文章中是在主页面中进行手动输入的,而如果我想要在这里面在加上语音搜索的入口自然也是也可以的,只不过页面的代码就很多了,因此痛定思痛我打算新写一个页面单独做这个语音输入,然后搜索物品分类,这样可能看得人也好理解的,因此本文中可能会先改动这个MainActivity,然后把手动输入搜索移到一个新的页面中。这样主页面就作为其他的方式的入口。
晨曦_LLW
2021/04/25
1.9K0
Android 垃圾分类APP(三)垃圾分类之语音输入
相关推荐
Android 天气APP(三十三)语音播报
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验