讯飞SDK的使用
在配置好Android Studio 2.3.3后,依照结合网上例子,动手创建讯飞语言听写app,最终手机上运行成功。
主要参考两篇博文(zqHero/XunFeiVoiceDEmo ,Android Studio 2.3.3 接入讯飞语音接口),都非常好,基本步骤参考第一篇,代码参考第二篇。
创建讯飞应用:在讯飞开发平台注册账号,在网站上创建应用,得到一个APPID,这个ID用来绑定讯飞SDK和自己制作的APP
创建SDK:选择所需服务(如语言听写)、平台(Android)、和应用(第一步创建的应用),然后下载该SDK。SDK主要有三个文件夹,/assets,/libs,/sample.
创建android Studio项目:新建项目,修改项目名(如VoiceDemo)后其余都为默认,创建一个helloworld项目,文件浏览方式默认为Android,改为Project方式。
复制.jar文件:将SDK中/libs文件夹中的.jar文件都复制到android项目VoiceDemo/app/libs/文件夹下。可能由于生成SDK时只选择语言听写,只有两个.jar文件(分别为Msc.jar,Sunflower.jar)
复制.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的文件
复制/assets文件夹:将SDK中/assets文件夹复制到VoiceDemo/app/src/main/下
刷新.gradle文件:选中VoiceDemo/app下的build.gradle,右键选择Synchronize 'build.gradle',依次刷新其它两个.gradle文件。工具栏中也有Synch Project with Gradle Files*可能达到同样效果。在这一步中.gradle中没有出现文章二中的代码,我也没有手动添加,但好像影响不大。初次接触Android编程,不懂原理,希望热心人解答。
编辑权限:在*VoiceDemo/app/src/main/AndroidManifest.xml文件中依照第二篇文章代码添加相应权限;
编辑布局:在*VoiceDemo/app/src/main/res/layout/activity_main.xml文件中依照第二篇文章添加按钮和文本框
编辑功能:在*VoiceDemo/app/src/main/java/example.org.voicedemo/MainActivity.java文件中依照第二篇文章添加给按钮添加功能,将在讯飞平台创建得到的APPID添加进去。在这一步时import com.iflytek包全部显示有红色下划线,提示找不到com.iflytek。我将项目关闭后重新打开红色下划线就不存在了。这个bug出现的很奇怪,解决的也很奇怪。希望有热心人解答。
Run app:选择在模拟其中运行,能够显示主页面布局,点击按钮录音时提示权限不对,但却没有同意权限的选择弹出。选择在手机中安装运行,报错-26.
打包生成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
讯飞SDK的使用的更多相关文章
- Android Studio快速集成讯飞SDK实现文字朗读功能
今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ...
- 使用讯飞SDK,实现文字在线合成语音
private SpeechSynthesizer mTts; private int isSpeaking = 0; mTts= SpeechSynthesizer.createSynthesize ...
- 安卓使用讯飞sdk报错
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.iflytek.cloud.SpeechSy ...
- iphone之使用讯飞语音sdk实现语音识别功能
1.首先下载讯飞sdk及文档:http://open.voicecloud.cn/ 2.学习里面的demo简单实现了一个小的语音识别功能 先做一个简单demo,看看识别效果.注:语音识别必须联网. 所 ...
- 使用javacv录像,同时进行讯飞声纹认证
由于最近的demo中需要在活体检测的同时进行音视频录制 , 尝试使用MediaRecord和camera来录制视频 , 然而Camera.onPreviewFrame 不能与 MediaRecord ...
- UNITY 接讯飞语音过程总结
11:13 2017/3/141,安装问题:JDK与ECLIPSE位数一定要对应,32位对64位会出现 java was returned ....code 13的弹框错误.版本号可以不一致.2,EC ...
- 关于讯飞 使用android SDK出现21001错误码的分析
21001,没有安装语音组件1.有没有使用SpeechUtility.createUtility()设置appid2.有没有将libmsc.so放到工程中,jar包有Msc.jar.Sunflower ...
- 讯飞语音SDK Android平台使用
1. 支持功能介绍: 2. Android API主要业务接口和流程介绍 -------------------------------------------------------- 工程代码: ...
- 【Unity】讯飞语音识别SDK
1.进入讯飞官网,注册帐号,进入控制台,创建新应用UnityXunfeiDemo,平台选Android.在当前应用这点下载SDK,添加AI能力(添加新服务),选择语音听写,即可下载安卓SDK(下称讯飞 ...
随机推荐
- 记录一个比较少用的容器C++ std::bitset
bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一. bitset中的每个 ...
- Java连接MQ的实例, 测试类
package cjf.mq.mqclient; import com.ibm.mq.MQC; import com.ibm.mq.MQEnvironment; import com.ibm.mq.M ...
- iOS动画的要素:CALayer维护数据模型和图片,沟通了CPU和GPU--视图中与图形绘制相关的功能
1)iOS动画的模型:三层树模型: CALayer维护数据模型和图片,沟通了CPU和GPU:数据模型和图片本尊有CPU生成和维护:图片动画由GPU合成和呈现: https://developer.ap ...
- Mac iTerm2使用总结
1.快捷键大全新建标签:command + t关闭标签:command + w切换标签:command + 数字 command + 左右方向键切换全屏:command + enter查找:comma ...
- 【[USACO12FEB]附近的牛Nearby Cows】
我记得我调这道题时中耳炎,发烧,于是在学长的指导下过了也没有发题解 发现我自己的思路蛮鬼畜的 常规操作:\(f[i][j]\) 表示到\(i\)的距离为\(j\)的奶牛有多少只,但注意这只是在第二遍d ...
- 20145238-荆玉茗 《网络对抗》-逆向及Bof基础实践
20145238荆玉茗<网络对抗>-逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:m ...
- 阅读layim代码小记,监听事件实现方法
(function (win) { //注册事件 var chat = function () { $('#open').on('click', function () { sendMessage() ...
- Selenium基础知识(详解IDE命令、css及xpath定位一)
1. ide常用命令,参考 http://sariyalee.iteye.com/blog/1743350 2. ide介绍,参考 http://blog.csdn.net/oscar999/art ...
- 启动memcache
"D:\SOFT\memcached-1.4.5-amd64\memcached-amd64\memcached.exe"
- update会锁表吗?
update会锁表吗? 两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务. ...