zoukankan      html  css  js  c++  java
  • 讯飞SDK的使用

     

    在配置好Android Studio 2.3.3后,依照结合网上例子,动手创建讯飞语言听写app,最终手机上运行成功。

    主要参考两篇博文(zqHero/XunFeiVoiceDEmo ,Android Studio 2.3.3 接入讯飞语音接口),都非常好,基本步骤参考第一篇,代码参考第二篇。

    1. 创建讯飞应用:在讯飞开发平台注册账号,在网站上创建应用,得到一个APPID,这个ID用来绑定讯飞SDK和自己制作的APP

    2. 创建SDK:选择所需服务(如语言听写)、平台(Android)、和应用(第一步创建的应用),然后下载该SDK。SDK主要有三个文件夹,/assets,/libs,/sample.

    3. 创建android Studio项目:新建项目,修改项目名(如VoiceDemo)后其余都为默认,创建一个helloworld项目,文件浏览方式默认为Android,改为Project方式。

    4. 复制.jar文件:将SDK中/libs文件夹中的.jar文件都复制到android项目VoiceDemo/app/libs/文件夹下。可能由于生成SDK时只选择语言听写,只有两个.jar文件(分别为Msc.jar,Sunflower.jar)

    5. 复制.so文件:先在android项目VoiceDemo/app/src/main/下新建文件夹/jniLibs,将SDK中/libs下的包含.so文件夹全部复制到VoiceDemo/app/src/main/jniLibs/文件夹下。总共七个文件夹分别是/arm64-v8a,/armeabi,/armeabi-v7a,/mips,/mips64,/x86,/86_64,每个文件夹下都只有一个名为libmsc.so的文件

    6. 复制/assets文件夹:将SDK中/assets文件夹复制到VoiceDemo/app/src/main/

    7. 刷新.gradle文件:选中VoiceDemo/app下的build.gradle,右键选择Synchronize 'build.gradle',依次刷新其它两个.gradle文件。工具栏中也有Synch Project with Gradle Files*可能达到同样效果。在这一步中.gradle中没有出现文章二中的代码,我也没有手动添加,但好像影响不大。初次接触Android编程,不懂原理,希望热心人解答。

    8. 编辑权限:在*VoiceDemo/app/src/main/AndroidManifest.xml文件中依照第二篇文章代码添加相应权限;

    9. 编辑布局:在*VoiceDemo/app/src/main/res/layout/activity_main.xml文件中依照第二篇文章添加按钮和文本框

    10. 编辑功能:在*VoiceDemo/app/src/main/java/example.org.voicedemo/MainActivity.java文件中依照第二篇文章添加给按钮添加功能,将在讯飞平台创建得到的APPID添加进去。在这一步时import com.iflytek包全部显示有红色下划线,提示找不到com.iflytek。我将项目关闭后重新打开红色下划线就不存在了。这个bug出现的很奇怪,解决的也很奇怪。希望有热心人解答。

    11. Run app:选择在模拟其中运行,能够显示主页面布局,点击按钮录音时提示权限不对,但却没有同意权限的选择弹出。选择在手机中安装运行,报错-26.

    12. 打包生成APK:在Build工具选项下选择Build APK将生成的APK拷贝到手机中安装,同意相应权限后,语音听写功能正常运行。如第二篇文章。

    项目文件的代码:

    AndroidManifest.xml


    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="example.org.voicedemo">

       <application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:roundIcon="@mipmap/ic_launcher_round"
           android:supportsRtl="true"
           android:theme="@style/AppTheme">
           <activity android:name=".MainActivity">
               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
       </application>

       <uses-permission android:name="android.permission.INTERNET" />
       <uses-permission android:name="android.permission.RECORD_AUDIO" />
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
       <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
       <!--读取网络信息状态 -->
       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
       <!--获取当前wifi状态 -->
       <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
       <!--允许程序改变网络连接状态 -->
       <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
       <!--读取手机信息权限 -->
       <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
       <uses-permission android:name="android.permission.WRITE_SETTINGS" />


    </manifest>

    activity_main.xml


    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context="example.org.voicedemo.MainActivity">

       <TextView
           android:id="@+id/textView"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Hello World!"
           tools:layout_constraintTop_creator="1"
           tools:layout_constraintRight_creator="1"
           tools:layout_constraintBottom_creator="1"
           app:layout_constraintBottom_toBottomOf="parent"
           app:layout_constraintRight_toRightOf="parent"
           tools:layout_constraintLeft_creator="1"
           app:layout_constraintLeft_toLeftOf="parent"
           app:layout_constraintTop_toTopOf="parent" />

       <Button
           android:id="@+id/button"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Button"
           tools:layout_constraintTop_creator="1"
           tools:layout_constraintRight_creator="1"
           app:layout_constraintRight_toRightOf="parent"
           android:layout_marginTop="20dp"
           app:layout_constraintTop_toBottomOf="@+id/textView"
           tools:layout_constraintLeft_creator="1"
           app:layout_constraintLeft_toLeftOf="parent" />



    </android.support.constraint.ConstraintLayout>

    MainActivity.java


    package example.org.voicedemo;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;

    import android.os.Environment;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    import com.iflytek.cloud.RecognizerResult;
    import com.iflytek.cloud.SpeechConstant;
    import com.iflytek.cloud.SpeechError;
    import com.iflytek.cloud.SpeechRecognizer;
    import com.iflytek.cloud.SpeechUtility;
    import com.iflytek.cloud.ui.RecognizerDialog;
    import com.iflytek.cloud.ui.RecognizerDialogListener;

    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.json.JSONTokener;

    public class MainActivity extends AppCompatActivity {

       private SpeechRecognizer mIat;
       private RecognizerDialog mIatDialog;
       private RecognizerDialogListener mRListener;

       private Button button;
       private TextView tv;
       private String result;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID +"=59f05070");  //=后面这里要替换成自己申请的 AppID

           mRListener = new RecognizerDialogListener() {
               @Override
               public void onResult(RecognizerResult results, boolean isLast) {
                   String text = parseIatResult(results.getResultString());
                   result += text;
                   tv.setText(result);
                   if (isLast) {

                       result = "";
                  }
              }

               @Override
               public void onError(SpeechError speechError) {

              }
          };
           mIatDialog = new RecognizerDialog(MainActivity.this, null);
           mIatDialog.setListener(mRListener);

           button = (Button)findViewById(R.id.button);
           tv = (TextView)findViewById(R.id.textView);

           button.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   setIatParam("zph");
                   mIatDialog.show();
              }
          });
      }

       private void setIatParam(String filename) {
           // 清空参数
           mIatDialog.setParameter(SpeechConstant.PARAMS, null);

           // 设置听写引擎
           mIatDialog.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);

           // 设置返回结果格式
           mIatDialog.setParameter(SpeechConstant.RESULT_TYPE, "json");

           // 设置语言
           mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
           // 设置语言区域
           mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");

           // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
           mIatDialog.setParameter(SpeechConstant.VAD_BOS, "4000");

           // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
           mIatDialog.setParameter(SpeechConstant.VAD_EOS, "2000");

           // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
           mIatDialog.setParameter(SpeechConstant.ASR_PTT, "1");

           // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
           // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
           mIatDialog.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
           mIatDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/MyApplication/" + filename + ".wav");
      }

       public static String parseIatResult(String json) {
           StringBuffer ret = new StringBuffer();
           try {
               JSONTokener tokener = new JSONTokener(json);
               JSONObject joResult = new JSONObject(tokener);

               JSONArray words = joResult.getJSONArray("ws");
               for (int i = 0; i < words.length(); i++) {
                   // 转写结果词,默认使用第一个结果
                   JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                   JSONObject obj = items.getJSONObject(0);
                   ret.append(obj.getString("w"));
              }
          } catch (Exception e) {
               e.printStackTrace();
          }
           return ret.toString();
      }
    }

    Github项目地址: https://github.com/danieltangdx/xunFeiVoiceDeom

    email:danieltangdx@outlook.com

  • 相关阅读:
    运算符
    变量
    JSP EL表达式使用
    MySQL JDBC 连接数据库基本操作
    一个带标号的CSS文章列表写法
    CSS图片列表
    YUI3 CSS
    Ubuntu 13.10 64位 无法 安装 ia32-libs 解决办法
    [转]编译Android源代码常见错误解决办法
    js 复制对象
  • 原文地址:https://www.cnblogs.com/dashawntang/p/7768503.html
Copyright © 2011-2022 走看看