Android实现语音合成与识别功能

Android语音合成与语音识别,供大家参考,具体内容如下

这里调用科大讯飞语音的API,语音云开放平台介绍

调用科大讯飞语音的API,需要加添库文件Msc.jar,添加libmsc.so文件,还需添加权限,具体步骤可参看SDK里的文档

参看开发的文档写了一个简单的语音合成和识别demo,图示如下

在EditText里输入文字,点击语音合成,可以实现文字转化为语音

点击语音合成,输入语音,识别的文字以提示的形式显示,并且显示在EditText中

主要代码如下,注意appid需要自己申请

package com.example.voice;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.iflytek.cloud.speech.*;

public class VoiceActivity extends Activity {
 private static final String APPID = "appid=52cddb99";
 private EditText et = null;
 private Button btn1 = null;
 private Button btn2 = null;
 String text = "";
 String temp="";

 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_voice);
 et = (EditText) findViewById(R.id.et);
 btn1 = (Button) findViewById(R.id.btn1);
 btn1.setOnClickListener(mylistener);
 btn2 = (Button) findViewById(R.id.btn2);
 btn2.setOnClickListener(mylistener);
 }

 private OnClickListener mylistener = new OnClickListener() {
 public void onClick(View v) {
 SpeechUser.getUser().login(VoiceActivity.this, null, null, APPID,
 loginListener);
 Button btn = (Button) v;
 switch (btn.getId()) {
 case R.id.btn1:
 SpeechSynthesizer mSpeechSynthesizer = SpeechSynthesizer
 .createSynthesizer(VoiceActivity.this);
 mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME,
 "xiaoyu");
 mSpeechSynthesizer.setParameter(SpeechConstant.SPEED, "50");
 mSpeechSynthesizer.startSpeaking(et.getText().toString(),
 mSynListener);
 break;
 case R.id.btn2:
 text = "";
 temp="";
 SpeechRecognizer recognizer = SpeechRecognizer
 .createRecognizer(VoiceActivity.this);
 recognizer.setParameter(SpeechConstant.DOMAIN, "iat");
 recognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
 recognizer.setParameter(SpeechConstant.ACCENT, "accent");
 recognizer.startListening(mRecoListener);
 break;
 }
 }
 };
 private SynthesizerListener mSynListener = new SynthesizerListener() {
 public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {
 }

 public void onCompleted(SpeechError arg0) {
 }

 public void onSpeakBegin() {
 }

 public void onSpeakPaused() {
 }

 public void onSpeakProgress(int arg0, int arg1, int arg2) {
 }

 public void onSpeakResumed() {
 }
 };
 private RecognizerListener mRecoListener = new RecognizerListener() {
 public void onBeginOfSpeech() {
 }

 public void onEndOfSpeech() {
 }

 public void onError(SpeechError error) {

 }

 public void onEvent(int arg0, int arg1, int arg2, String arg3) {
 }

 public void onVolumeChanged(int arg0) {
 }

 public void onResult(RecognizerResult results, boolean isLast) {
 //将解析后的字符串连在一起
 temp=results.getResultString();
 JsonParser json = new JsonParser();
 text+=json.parseIatResult(temp);
 if(isLast==true)
 {
 et.setText(text, null);
 Toast.makeText(VoiceActivity.this,text,Toast.LENGTH_LONG).show();
 }
 }
 };
 private SpeechListener loginListener = new SpeechListener() {
 public void onCompleted(SpeechError arg0) {
 }

 public void onData(byte[] arg0) {
 }

 public void onEvent(int arg0, Bundle arg1) {
 }
 };

 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.voice, menu);
 return true;
 }
}

布局文件

<TableLayout 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:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".VoiceActivity" >

 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:gravity="center"
 android:text="VoiceApplication" />

 <EditText
 android:id="@+id/et"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:gravity="top"
 android:layout_weight="0.32" />

 <Button
 android:id="@+id/btn1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="0.03"
 android:text="语音合成" />

 <Button
 android:id="@+id/btn2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="0.03"
 android:text="语音识别" />

</TableLayout>

解析Json格式的数据是参照讯飞的文档中的

package com.example.voice;

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

import android.text.TextUtils;

//import com.iflytek.speech.ErrorCode;
//import com.iflytek.speech.SpeechError;
/**
 * 对云端返回的Json结果进行解析
 *
 * @author iFlytek
 * @since 20131211
 */
public class JsonParser {

 /**
 * 听写结果的Json格式解析
 *
 * @param json
 * @return
 */
 public static String parseIatResult(String json) {
 if (TextUtils.isEmpty(json))
 return "";

 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"));
 // 如果需要多候选结果,解析数组其他字段
 // for(int j = 0; j < items.length(); j++)
 // {
 // JSONObject obj = items.getJSONObject(j);
 // ret.append(obj.getString("w"));
 // }
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 return ret.toString();
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 轻松实现语音识别详解及实例代码

    使用Intent调用语音识别程序 说明 Android中主要通过RecognizerIntent来实现语音识别,其实代码比较简单,但是如果找不到语音识别设备,就会抛出异常 ActivityNotFoundException,所以我们需要捕捉这个异常.而且语音识别在模拟器上是无法测试的,因为语音识别是访问google 云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别! 注意:使用前需要安装语音识别程序.如<语音搜索>

  • 百度语音识别(Baidu Voice) Android studio版本详解

    百度语音识别(Baidu Voice) Android studio版本 已同步更新至个人blog:http://dxjia.cn/2016/02/29/baidu-voice-helper/ 最近在一个练手小项目里要用到语音识别,搜索了一下,比较容易集成的就算Baidu voice跟讯飞语音了,baidu提供了直接可以使用的显示控件,而讯飞需要自己实现,另外baidu提供每天5W次的调用频率,对于我来说足够使用啦.所以就选择使用Baidu Voice(控件会有baidu logo和关键字,所以

  • 轻松实现Android语音识别功能

    苹果的iphone有语音识别用的是Google的技术,做为Google力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大. 所以Google Voice Recognition在Android 的实现就变得极其轻松. 语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google 提供的Api 实现这一功能. 功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上. * Copyright (

  • Android编程之语音识别实现方法

    本文实例讲述了Android编程之语音识别实现方法.分享给大家供大家参考,具体如下: 语音识别技术在手机上应用得相当广泛,人类日常最频繁的沟通方式是语音,而在手机应用中,大部分是通过硬件手动输入,目前这依然是主要与手机互动的方式.但是随着手机软硬件功能的不断提升,可以预见在不久的将来,语音交流将是人机交互的主要方式.IPhone手机内置的Siri语音助手就是一个很好的例子.而鲜为人知的是其使用的语音识别技术来自于Google.而想而知,作为Google力推的Android自然被植入了最核心的语音

  • Android实现语音识别代码

    苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大. 所以Google Voice Recognition在Android 的实现就变得极其轻松. 语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google 提供的Api 实现这一功能. 功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上. 功能界面如下: 用户

  • Android基于讯飞语音SDK实现语音识别

    一.准备工作 1.你需要android手机应用开发基础 2.科大讯飞语音识别SDK android版 3.科大讯飞语音识别开发API文档 4.android手机 关于科大讯飞SDK及API文档,请到科大语音官网下载:http://www.xfyun.cn/ 当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得Appid 如下图,申请一个APPID,就可以了. 二.语音识别流程 1.创建识别控件 函数原型 Public RecognizerDialo

  • Android语音识别技术详解及实例代码

    今天从网上找了个例子实现了语音识别,个人感觉挺好玩的,就把代码贴出来与大家分享下: Android中主要通过RecognizerIntent来实现语音识别,其实代码比较简单,但是如果找不到设置,就会抛出异常ActivityNotFoundException,所以我们需要捕捉这个异常.而且语音识别在模拟器上是无法测试的,因为语音识别是访问google云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别! 下面是Recog

  • Android使用百度语音识别的示例代码

    本文使用百度语音识别,完成语音识别的功能,使用百度语音识别,先要申请APP ID,这个直接到百度网站上有说明文档,本文不再赘述.申请之后,下载SDK包,按照百度官网要求,合并libs和res两个目录到项目中,然后在build.gradle(module:app)中的Android{...}下添加 sourceSets{ main{ jniLibs.srcDirs=['libs'] } } 这样, 百度语音识别的so文件才能正常使用. Manifest文件中添加权限 <uses-permissio

  • Android Studio应用开发集成百度语音合成使用方法实例讲解

    首先,语音合成是指将文本信息转换成声音.意思就是将文本转化为声音,让你的应用开口说话.国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞. 本文集成的是百度语音合成,其主要特点是: 完全永久免费 业界首创完全永久免费新形式,为开发者提供最流畅最自然的语音合成服务.完全免费,永久使用,彻底摆脱限制. 离线在线融合模式 SDK可以根据当前网络状况,自动判断使用本地引擎还是云端引擎进行语音合成,再也不用担心流量消耗! 多语言多音色可选 中文普通话.中英文混读.男声.女声任你选,更支持语速.音调

  • Android实现语音合成与识别功能

    Android语音合成与语音识别,供大家参考,具体内容如下 这里调用科大讯飞语音的API,语音云开放平台介绍 调用科大讯飞语音的API,需要加添库文件Msc.jar,添加libmsc.so文件,还需添加权限,具体步骤可参看SDK里的文档 参看开发的文档写了一个简单的语音合成和识别demo,图示如下 在EditText里输入文字,点击语音合成,可以实现文字转化为语音 点击语音合成,输入语音,识别的文字以提示的形式显示,并且显示在EditText中 主要代码如下,注意appid需要自己申请 pack

  • Android实现手势滑动识别功能

    对于Android中的手势识别可以从以下三个Listener入手--OnTouchListener.OnGestureListener.OnDoubleTapListener.这三个监听器分别是触摸监听.手势滑动监听和屏幕双击操作监听.很多的时候我们需要这些手势识别的操作,例如我们自定义控件的时候就经常会用到.下面就对这三个监听器分别进行介绍. 触摸监听器OnTouchListener 让我们的Activity去现实此接口,并重写onTouch方法.重写OnTouchListener的onTou

  • Android实现银行卡号扫描识别功能

    现在有好多扫描识别银行卡号的SDK都是收费的,但是也有不收费的,但是有一定的问题,就是那种印刷的银行卡号扫描不出来,希望哪位大神指导原因给解释下,这个不收费的SDK就是card.io-Android-SDK,githubdi地址 使用方式很简单,更多介绍可以看GitHub 使用文档: 首先导入依赖:compile 'io.card:android-sdk:5.5.1' 然后在你需要调用拍照的地方加上一下: Intent scanIntent = new Intent(this, CardIOAc

  • Android平台生成二维码并实现扫描 & 识别功能

    1.二维码的前世今生 "二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能

  • android实现汉字转拼音功能 带多音字识别

    android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下 问题来源 在做地名按首字母排序的时候出现了这样一个bug.长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qing.于是排序出了问题. 汉字转拼音库和多音字识别库 1.多音字对应的词汇库 2.文字的二进制大小对应的拼音库 关键代码 1.我在这里首先将要转化的文字转化成对应的"gb2312"编码.汉字转化成二进制编码一般占两个字节,如果一个字节返回字符,如果是两个字节算一下偏移量.代码如下 /** *

  • Android指纹识别功能深入浅出分析到实战(6.0以下系统解决方案)

    指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统,主要还提供6.0以下设备适配解决方案. 指纹识别用途 大概列举几个指纹识别的用途 系统解锁 应用锁 支付认证 普通的登录认证 指纹识别Google官方文档 官方标准库 Google提供的与指纹识别相关的核心类不多,主类是FingerprintManager,主类依赖三个内部类,如下图所示: Fing

  • android实现指纹识别功能

    功能介绍 支持指纹识别,兼容 Android 6.0 和 Android 9.0 提供界面友好的指纹识别弹窗,可自定义其样式 实现国际化(支持中文和英文) Gradle依赖 dependencies { implementation 'com.github.ZuoHailong:BiometricPrompt:0.2.3' } 指纹识别用法简述 FingerprintVerifyManager.Builder builder = new FingerprintVerifyManager.Buil

  • Android上使用ZXing识别条形码与二维码的方法

    目前有越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文所述实例就使用了ZXing 1.6实现条码/二维码识别.ZXing是个很经典的条码/二维码识别的开源类库,早在很久以前,就有开发者在J2ME上使用ZXing了,只不过需要支持JSR-234规范(自动对焦)的手机才能发挥其威力,而目前已经有不少Android手机具备自动对焦的功能. 本文代码运行的结果如下,使用91手机助手截图时,无法截

  • Android 6.0指纹识别App开发案例

    在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么

  • Android中的指纹识别demo开发实例

    指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说,纯本地的

随机推荐