热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要为大家详细介绍了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;
 }
}

布局文件


 
 
 
 
 
 

解析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 

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


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
author-avatar
-不想醒来-县
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有