讯飞语音——带你简单实现语音听写
来源:互联网 发布:互联网金融网络平台 编辑:程序博客网 时间:2024/05/17 15:37
语音听写 de 简单实现
一、前言
如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用
二、功能描述
语音听写和语音合成都是较为基础也是最常使用的两个基本功能。
语音合成是将文本转化为语音说出来,就是读文章。
语音听写是什么呢?
开启或者说触发语音听写的功能,我们开始讲话,然后讲话结束;该服务能将说话的内容转化为文本;
当然功能是这样,用途不仅仅是讲说话内容转化为文本。理解说话者的意图,这才是人工智能的方向。
这里我们简单的以一个小项目实例实现简单的语音听写。
三、项目实例
<1.1>项目结构如下图所示:
<2.1>.新建Android Application Project 项目,命名为TestHearerDemo,
<2.1.1>说明:
项目结构基本和上一个项目一样,如果看过上一个语音合成可直接跳过该步骤,去看代码实现部分。首先有几个注意点,避免初始化错误,讯飞语音版本自升级后要求,SDK 与 Appid 一一对应。导入配置文件到新建工程TestHearerDemo
<2.1.2>配置文件:
assets与libs 下的包
注意arm中的so文件必须与当前key值是对应的。就是创建应用时下载的 SDK中所包含的文件,appid 是创建应用时所产生的,不同的应用key值不同。
四、项目代码
<1.1>.test.layout布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="20dp" android:text="所说内容:" /> <EditText android:id="@+id/content_et" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/editbox_dropdown_light_frame" android:cursorVisible="true" android:enabled="true" android:gravity="top" android:visibility="visible" /> <Button android:id="@+id/listen_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开始说话" /> </LinearLayout>
<1.2>MainActivity.java 代码如下:
package pers.rfeng.demo;import java.util.HashMap;import java.util.LinkedHashMap;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import org.json.JSONTokener;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 android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity implements OnClickListener { //存放听写分析结果文本 private HashMap<String, String> hashMapTexts = new LinkedHashMap<String, String>(); private Button b_btn; //初始化控件 private EditText e_text; SpeechRecognizer hearer; //听写对象 RecognizerDialog dialog; //讯飞提示框 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); b_btn = (Button) findViewById(R.id.listen_btn); e_text = (EditText) findViewById(R.id.content_et); b_btn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.listen_btn: // 语音配置对象初始化 SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=57b2decc"); // 1.创建SpeechRecognizer对象,第2个参数:本地听写时传InitListener hearer = SpeechRecognizer.createRecognizer( MainActivity.this, null); // 交互动画 dialog = new RecognizerDialog(MainActivity.this, null); // 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类 hearer.setParameter(SpeechConstant.DOMAIN, "iat"); // domain:域名 hearer.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); hearer.setParameter(SpeechConstant.ACCENT, "mandarin"); // mandarin:普通话 //3.开始听写 dialog.setListener(new RecognizerDialogListener() { //设置对话框 @Override public void onResult(RecognizerResult results, boolean isLast) { // TODO 自动生成的方法存根 Log.d("Result", results.getResultString()); //(1) 解析 json 数据<< 一个一个分析文本 >> StringBuffer strBuffer = new StringBuffer(); try { JSONTokener tokener = new JSONTokener(results.getResultString()); Log.i("TAG", "Test"+results.getResultString()); Log.i("TAG", "Test"+results.toString()); 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); strBuffer.append(obj.getString("w")); } } catch (Exception e) { e.printStackTrace(); } // String text = strBuffer.toString(); // (2)读取json结果中的sn字段 String sn = null; try { JSONObject resultJson = new JSONObject(results.getResultString()); sn = resultJson.optString("sn"); } catch (JSONException e) { e.printStackTrace(); } //(3) 解析语音文本<< 将文本叠加成语音分析结果 >> hashMapTexts.put(sn, strBuffer.toString()); StringBuffer resultBuffer = new StringBuffer(); //最后结果 for (String key : hashMapTexts.keySet()) { resultBuffer.append(hashMapTexts.get(key)); } e_text.setText(resultBuffer.toString()); e_text.requestFocus();//获取焦点 e_text.setSelection(1);//将光标定位到文字最后,以便修改 } @Override public void onError(SpeechError error) { // TODO 自动生成的方法存根 error.getPlainDescription(true); } }); dialog.show(); //显示对话框 break; default: break; } }}
<1.3>AndroidManifest.xml配置文件
注意权限配置
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pers.rfeng.demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="pers.rfeng.demo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 移动统计分析 --> <meta-data android:name="IFLYTEK_APPKEY" android:value="'57b2decc'" /> <meta-data android:name="IFLYTEK_CHANNEL" android:value="Android_Demo" /> </application> <!-- 连接网络权限,用于执行云端语音能力 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!--读取网络信息状态 --> <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.READ_CONTACTS"/></manifest>
五、项目演示
运行项目效果如下:
界面可能有点儿不好看,嘻嘻
说明:
点击按钮,可以开始说话,讯飞语音默认说话最长时长不超过 1 分钟
语音听写分析结果显示
希望对你有所帮助,更多功能请参考开发文档
- 讯飞语音——带你简单实现语音听写
- 讯飞语音——带你简单实现语音合成
- Android 简单讯飞语音合成与语音听写
- 使用讯飞语音的语音听写
- 讯飞语音听写和语音合成
- Android实战——科大讯飞语音听写SDK的使用,实现语音识别功能
- Android实战——科大讯飞语音听写SDK的使用,实现语音识别功能
- 讯飞语音开发之语音听写--不带ui界面
- 讯飞语音开发之语音语音听写
- Android开发 语音识别技术之科大讯飞语音识别(一) — 语音听写
- H5调用讯飞语音接口实现在线语音听写测评
- Android讯飞语音云语音听写学习
- 讯飞语音听写常见问题
- 讯飞语音听写Demo
- 讯飞语音的语音听写功能实现的总结以及新手如何着手第三方SDK
- 语音听写与合成--(讯飞语音识别与合成&&百度语音识别)
- Android科大讯飞语音听写实现
- 第三方SDK:讯飞语音听写
- 快速排序(升序)
- 1130 N的阶乘的长度 V2(斯特林近似)
- (学习笔记) SPI通信协议
- 常用的事件触发
- springmvc 得到HttpServletRequest、HttpServletResponse、HttpSession
- 讯飞语音——带你简单实现语音听写
- 透透彻彻IoC(你没有理由不懂!)
- Codeforces 722C Destroying Array【逆序(离线)思维+并查集】
- mysql 几个常用锁机制
- 指针数组和数组指针
- HDOJ题目分类
- 数字电路为什么是低电平有效的多
- Servlet基础
- C语言数组名取地址