自然语言交流系统 phxnet团队 创新实训 个人博客 (六)

讯飞的语音sdk是需要申请的,地址是:http://dev.voicecloud.cn/developer.php?vt=1 。申请一个讯飞的开发者账号,然后申请一个appid,申请的时候需要填写开发者信息和你的应用的信息。

申请之后经过审核通过,会得到一个appid,这个是在使用语音服务时需要用到的。(笔者感觉申请还是比较容易通过的,简单地填写一下就通过了。速度也很快,我在晚上十一点多申请的,到第二天早上九点多就收到审核通过的邮件。个人感觉这个审核只是为了防止恶意使用,毕竟语音服务是要使用讯飞的服务器资源的。)

申请到appid之后就可以下载SDK了,然后使用语音服务了。

以下我试用的过程,(点击button,弹出语音框,说完之后将识别的结果显示在EditText中):

  • 在eclipse里新建一个android工程
  • 导入讯飞的语音jar包
  • 讯飞的服务是需要一堆权限的,在manifest.xml中加入

    [html] view plain copy

    print?

    1. <uses-permission android:name="android.permission.RECORD_AUDIO" />
    2. <uses-permission android:name="android.permission.INTERNET" />
    3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    5. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    6. <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    分别为:通过麦克风录音、联网、获取网络信息状态、获取wifi状态、改变网络状态如是否能联网、访问电话状态

  • 在main.xml中添加一个EditText和一个Button,如下

    [html] view plain copy

    print?

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="fill_parent"
    4. android:layout_height="fill_parent"
    5. android:orientation="vertical" >
    6. <EditText
    7. android:id="@+id/editText"
    8. android:layout_width="fill_parent"
    9. android:layout_height="300dp"
    10. android:gravity="top"
    11. android:inputType="textMultiLine" >
    12. <requestFocus />
    13. </EditText>
    14. <Button
    15. android:id="@+id/button_start"
    16. android:layout_width="wrap_content"
    17. android:layout_height="wrap_content"
    18. android:text="点击开始说话" />
    19. </LinearLayout>
  • 然后在MainActivity中编写代码实现了

(这里可以看到在线的文档:http://dev.voicecloud.cn/developer.php?category=YW5kcm9pZA%3D%3D&column=ZG9jdW1lbnQ%3D&type=d2lkZ2V0

通过阅读讯飞给的文档,可以发现标准的识别控件是RecognizerDialog——是一个Dialog的子类,所以我们是可以在Activity中通过showDialog(int)方法来调用它的。

重写Activity的方法

[java] view plain copy

print?

  1. @Override
  2. protected Dialog onCreateDialog(int id) {}

在其中创建并设置好一个RecognizerDialog即可。

创建RecognizerDialog方法为

[java] view plain copy

print?

  1. RecognizerDialog recognizerDialog = new RecognizerDialog(
  2. MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid

(其中appid应该写自己从讯飞申请到的appid,由于协议的问题,我不便把自己申请的id公开,所以这里用了1234567来代替。根据讯飞的说明,非法的appid是不能使用语音服务的,但是我用随机数字试验了一下,居然也是能用的,不知道是不是BUG。)

官方的文档:

然后需要设置识别参数

[java] view plain copy

print?

  1. recognizerDialog.setEngine("sms", null, null);

第一个参数“sms”表示为请求的服务为“语音识别”。后两个参数暂时设为null就好。

官方文档:

最后还需给recognizerDialog设置一个listener,回调接口用以获取结果,

recognizerDialog.setListener(RecognizerDialogListener listener)的参数为RecognizerDialogListener接口,实现此接口要重写两个方法:onResults(ArrayList results,boolean isLast)和onEnd(SpeechError error)。用以获取和处理结果。

我的实现为直接写了一个匿名类:

[java] view plain copy

print?

  1. recognizerDialog.setListener(new RecognizerDialogListener() {
  2. @Override
  3. public void onResults(ArrayList<RecognizerResult> results,
  4. boolean arg1) {
  5. StringBuffer result = new StringBuffer();
  6. for (RecognizerResult r : results) {
  7. result.append(r.text);
  8. }
  9. editText.setText(result.toString());
  10. }
  11. @Override
  12. public void onEnd(SpeechError arg0) {
  13. }
  14. });

然后将此RecognizerDialog返回即可。

完整的MainActivity代码:

[java] view plain copy

print?

  1. import com.iflytek.speech.RecognizerResult;
  2. import com.iflytek.speech.SpeechError;
  3. import com.iflytek.ui.RecognizerDialog;
  4. import com.iflytek.ui.RecognizerDialogListener;
  5. public class MainActivity extends Activity {
  6. EditText editText = null;
  7. Button startButton = null;
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. editText = (EditText) findViewById(R.id.editText);
  13. startButton = (Button) findViewById(R.id.button_start);
  14. startButton.setOnClickListener(new OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. showDialog(1);
  18. }
  19. });
  20. }
  21. @Override
  22. protected Dialog onCreateDialog(int id) {
  23. RecognizerDialog recognizerDialog = new RecognizerDialog(
  24. MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid
  25. recognizerDialog.setEngine("sms", null, null);
  26. recognizerDialog.setListener(new RecognizerDialogListener() {
  27. @Override
  28. public void onResults(ArrayList<RecognizerResult> results,
  29. boolean arg1) {
  30. StringBuffer result = new StringBuffer();
  31. for (RecognizerResult r : results) {
  32. result.append(r.text);
  33. }
  34. editText.setText(result.toString());
  35. }
  36. @Override
  37. public void onEnd(SpeechError arg0) {
  38. }
  39. });
  40. return recognizerDialog;
  41. }
  42. }

程序在真机运行截图,经过检验,科大讯飞的识别率还是很高的。

时间: 2024-08-06 03:40:37

自然语言交流系统 phxnet团队 创新实训 个人博客 (六)的相关文章

自然语言交流系统 phxnet团队 创新实训 项目博客 (五)

3DMax方面所涉及的专业知识:                       (1)一下的关于3DMax中对于人物的设计和操作均需要在对3DMax基础知识熟练掌握的情况下进行的. (2)骨骼架设:首先对导入到3DMax中的人物模型进行架设骨骼,首先,先加载一个人,锁定住,别让他乱动.用biped工具建立一个基本骨骼--可以从脚部位置往上拖拽鼠标来建立.在运动命令面板,点biped卷展栏的 figure mode在各视图中,使用旋转缩放位移的方式,调整骨骼的位置与模型的位置,让二者对齐. PS: 

自然语言交流系统 phxnet团队 创新实训 个人博客 (十一)

名思义是 给游戏场景 添加一个 天空背景 让游戏更加精美,更具有魅力 添加天空盒 有两种方式  1 : 在当前相机上添加skybox   2 : 在当前场景上添加skybox 上面的两种方式的结果是一样的   第一种方式的优势在于 如果 世界中有多个摄像机的话,切换摄像机 需要看不同的天空 就可以使用这种方式实现 我们先来试试unity 给我们的提供的天空盒 吧  要使用 unity 当然要先导入天空资源包啦 导入方式 : assets -> import package ->skyboxes

自然语言交流系统 phxnet团队 创新实训 项目博客 (十二)

关于情感词典的学习总结: 情感倾向可认为是主体对某一客体主观存在的内心喜恶,内在评价的一种倾向.它由两个方面来衡量:一个情感倾向方向,一个是情感倾向度. 情感倾向方向也称为情感极性.在微博中,可以理解为用户对某客体表达自身观点所持的态度是支持.反对.中立,即通常所指的正面情感.负面情感.中性情感.例如"赞美"与"表扬"同为褒义词,表达正面情感,而"龌龊"与"丑陋"就是贬义词,表达负面情感. 情感倾向度是指主体对客体表达正面情感

自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)

项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器学习的书籍对其隐藏层到输出层的权值修正算法进行改进. 3.情感词汇 使用台湾大学的(中文情感极性词典 NTUSD)情感词汇进行训练.作为判断情感的依据. 4.中文聊天机器人原型系统的设计.(参考自百度文库:http://wenku.baidu.com/link?url=QIAQg6yw4854FgD

自然语言交流系统 phxnet团队 创新实训 项目博客 (十三)

对我们项目中的关键技术实现进行总结: 一.3DMax关键技术实现 1.一下的关于3DMax中对于人物的设计和操作均需要在对3DMax基础知识熟练掌握的情况下进行的. 2. 骨骼架设:首先对导入到3DMax中的人物模型进行架设骨骼,首先,先加载一个人,锁定住,别让他乱动.用biped工具建立一个基本骨骼--可以从脚部位置往上拖拽鼠标来建立.在运动命令面板,点biped卷展栏的 figure mode在各视图中,使用旋转缩放位移的方式,调整骨骼的位置与模型的位置,让二者对齐. PS: 1双击骨骼,可

自然语言交流系统 phxnet团队 创新实训 项目博客 (六)

从你进入软件开始,你就建立了和服务器的联系.这是一段和服务器的长连接,直到你退出此软件. 2D文字聊天界面大致实现了文字输入.发送消息.接收消息.你可以通过点击按钮让机器人开启聊天模式或者学习模式.又或是进入3D语音聊天界面或者退出.在assets文件夹下导入NGUI(使用的是3.6.8版本的.unitypackage)包,点击按钮时有声音和透明度.阴影的变化,通过给按钮添加声音.....这样的组件,使得用户体验得到提高,每当点击发送按钮实例化一个prefab呈现在聊天对话框中,你可以看见你发送

自然语言交流系统 phxnet团队 创新实训 个人博客 (十)

下载emacs-23.1.tar.gz http://ftp.gnu.org/pub/gnu/emacs/emacs-23.1.tar.gz cd /opt    //cp emacs-23.1.tar.gz /opt    tar -xvzf emacs-23.1.tar.gz     cd emacs-23.1   ./configure    make    make install -z 与-x联用时用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该

自然语言交流系统 phxnet团队 创新实训 个人博客 (十二)

在本项目中关于天空盒子的使用的配置方法: 给场景添加天空盒  第二种方式   在菜单栏中选择:Edit->Render Setting,在保证不在选择场景中其它文件的前提下,Inspector面板中将显示Render Setting属性,入下图     c.在skybox Material中指定一个天空盒材质,点击运行,将会看到该场景出现天空背景了.   是不是同样好简单  咔咔    那如何自己制作天空盒呢 其实同样好简单的 就是 一个球形材质加上 6 个天空图片纹理就可以了 首先在proje

自然语言交流系统 phxnet团队 创新实训 个人博客 (十四)

关于WikiExtractor的学习笔记: WikiExtractor是一个Python 脚本,专门用于提取和清洗Wikipedia的dump数据,支持Python 2.7 或者 Python 3.3+,无额外依赖,安装和使用都非常方便: 安装: git clone https://github.com/attardi/wikiextractor.gitcd wikiextractor/sudo python setup.py install 使用: WikiExtractor.py -o en