Android TTS文字转语音开发

标签: android tts 文字 | 发表时间:2015-02-05 11:40 | 作者:shendan00
出处:http://blog.csdn.net

之前在做TTS开发的时候能够正常的将文字转为语音,但是今天做了一个小程序,结果却发不了音,仔细测试了一下,发现了一个问题。

首先先讲下TTS如何实现。

1、安装语音库,假如要中文发音,科大讯飞语音3.0就很好。

2、最简单的程序如下:

package com.example.tts;

import java.util.Locale;

import android.speech.tts.TextToSpeech;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements TextToSpeech.OnInitListener{
	TextToSpeech textToSpeech = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textToSpeech = new TextToSpeech(this, this);			
		textToSpeech.speak("此处无声", TextToSpeech.QUEUE_ADD, null);
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	protected void onDestroy()
    {    	
    	super.onDestroy();
    	if (textToSpeech!=null) {
    		textToSpeech.shutdown();
		}   		
    }
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			textToSpeech.speak("此处有声", TextToSpeech.QUEUE_FLUSH, null);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onInit(int status) {
		// TODO Auto-generated method stub
		if (status == TextToSpeech.SUCCESS) {  
            int result = textToSpeech.setLanguage(Locale.CHINESE);          
            if (result == TextToSpeech.LANG_MISSING_DATA  
                    || result == TextToSpeech.LANG_NOT_SUPPORTED
                    || result == TextToSpeech.ERROR) {  
                Toast.makeText(this, "数据丢失或语言不支持", Toast.LENGTH_SHORT).show();  
            }  
            if (result == TextToSpeech.LANG_AVAILABLE) {
            	Toast.makeText(this, "支持该语言", Toast.LENGTH_SHORT).show();  
			}
            Toast.makeText(this, "初始化成功", Toast.LENGTH_SHORT).show();  
        } 
	}
}

无需任何权限,这里有个问题,就是在动态创建一个对象之后,在onCreate里面调用speak方法,并不能发出声音。

可以把文字保存为语音文件,也可以读取语音文件

	public void saveToFile(TextToSpeech speech,String text,String file)
	{		
		String destFileName = "/sdcard/tts/"+file+".wav";		
		speech.synthesizeToFile(text, null, destFileName);
	}
	
	public void readFromFile(TextToSpeech speech,String file)
	{
		String destFileName = "/sdcard/tts/"+file+".wav";
		speech.addSpeech("2", destFileName);		
		speech.speak("2", TextToSpeech.QUEUE_ADD, null);
		
	}

这样就可以了。

接下来讲一下如何实现语音识别

语音识别首先可以考虑使用科大讯飞,但是目前使用必须要联网,而且申请一个APPID。

用起来不难

1、语音合成功能

private SpeechSynthesizer speechSynthesizer;

SpeechUser.getUser().login(MainActivity.this, null, null, "appid=54d304cf", null);

speechSynthesizer = SpeechSynthesizer.createSynthesizer(this);
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
speechSynthesizer.setParameter(SpeechConstant.SPEED, "50");
speechSynthesizer.setParameter(SpeechConstant.VOLUME, "50");
speechSynthesizer.setParameter(SpeechConstant.PITCH, "50");

String text = editText.getText().toString();
speechSynthesizer.startSpeaking(text, null);

注册--设置--播放。文字转语音功能需要联网,但不需要正确的APPID,可以直接使用。但是语音识别就需要联网和正确的APPID


2、语音识别

private RecognizerDialog recognizerDialog;

SpeechUser.getUser().login(MainActivity.this, null, null, "appid=54d304cf", null);

recognizerDialog = new RecognizerDialog(this);
recognizerDialog.setParameter(SpeechConstant.DOMAIN, "iat");
recognizerDialog.setParameter(SpeechConstant.SAMPLE_RATE, "16000");

//显示Dialog
recognizerDialog.setListener(dialogListener);
recognizerDialog.show();

private RecognizerDialogListener dialogListener = new RecognizerDialogListener() {
//识别结果回调
@Override
public void onResult(RecognizerResult arg0, boolean arg1) {
// TODO Auto-generated method stub
String text = JsonParser.parseIatResult(arg0.getResultString());
editText.append(text);
editText.setSelection(editText.length());
}

//识别结束回调
@Override
public void onError(SpeechError arg0) {
// TODO Auto-generated method stub

}
};

package com.example.viocedemo;

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

import android.text.TextUtils;

/**
 * 对云端返回的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"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return ret.toString();
	}
	
}

这样就可以实现语音输入了,非常简单。


作者:shendan00 发表于2015/2/5 11:40:37 原文链接
阅读:48 评论:0 查看评论

相关 [android tts 文字] 推荐:

Android TTS文字转语音开发

- - CSDN博客推荐文章
之前在做TTS开发的时候能够正常的将文字转为语音,但是今天做了一个小程序,结果却发不了音,仔细测试了一下,发现了一个问题. 1、安装语音库,假如要中文发音,科大讯飞语音3.0就很好. textToSpeech.speak("此处无声", TextToSpeech.QUEUE_ADD, null);.

Chrome 扩展已支持 TTS 语言合成

- MessyCS - 谷奥——探寻谷歌的奥秘
Chrome最新版已经内置TTS语音合成引擎,并向扩展开放API,开发者可以方便的调用系统引擎或自定义引擎将文本转换成语言并播放. 之前Google有过API可以请求文本,并接受返回的MP3再播放,而使用新的API,可以直接通过下面的代码方便的实现语音合成:. 同时还可以设置语速,音调,音量等参数.

Ekho TTS 7.5 发布,支持广东台山话

- - 开源中国社区最新新闻
Ekho(余音)是一个免费、开源的中文语音合成软件. 它目前支持粤语、普通话(国语)、广东台山话、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英语则通过 eSpeak 或 Festival 间接实现. Ekho 支持 Linux、Windows 和 Android 平台. 台山被称为中国第一侨乡,海外的台山籍人比台山市常住人口还要多.

Android 遥控车

- CasparZ - LinuxTOY
您确定您真的会用 Android 手机玩赛车. 16 岁的法国学生 Jonathan Rico 使用 Android 手机通过蓝牙实现了对改装玩具汽车的遥控. 操控的方式和那些标榜的智能手机游戏一样,使用重力感应,差别是这次控制的是现实世界中的遥控汽车. 收藏到 del.icio.us |.

Android免费?毛

- Ruby - FeedzShare
来自: 36氪 - FeedzShare  . 发布时间:2011年08月17日,  已有 2 人推荐. 微软CEO Steve Ballmer在预测竞争对手产品时通常口无遮拦. 比如他去年抨击Google的Android战略时,很多人都不屑一顾. 接着Android蚕食了微软的地盘,后来又开始侵犯苹果的地盘.

GetEd2k (Android应用)

- 某牢 - eMule Fans 电骡爱好者
GetEd2k是一个Android应用程序,作者是anacletus. 此应用可以帮助你把网页中的电驴(eDonkey) 链接添加到你个人电脑的电驴客户端里,不过前提是你的客户端开启了用于远程控制的Web interface(Web服务器,网页接口,Web界面),当然,eMule(电骡), MLDonkey 和 aMule 都支持该功能,所以这三种主流电驴客户端的用户都可以使用GetEd2k.

NoScript For Android发布

- John - Solidot
用于屏蔽脚本的浏览器流行扩展NoScript发布了Android版本. 开发者称已经在Firefox for Android测试过,此外也应该能工作在基于Maemo的设备上. 移动版NoScript可以帮助移动用户抵抗基于脚本的攻击. Android平台上的扩展功能和桌面版相似,允许用户对每个网站单独设置脚本执行许可.

Android 4.0发布

- coofucoo - Solidot
Shawn the R0ck 写道 "2011年10月19日早上10点,谷歌与三星联手在香港发布了Android 4.0和Galaxy Nexus. " Android 4.0 的主要特性包括:更精细的UI,加强多任务和通知功能,锁屏下可打开摄像头和浏览通知,改进文本输入和拼写检查;增强视频录制和图像编辑功能,支持剪裁和旋转图片、消除红眼、添加效果等;面部识别解锁;Android Beam允许两台支持NFC的设备之间交换应用程序、联系人、音乐和视频;Wi-Fi Direct,蓝牙HDP,等等.

Android入门:ContentProvider

- - ITeye博客
一、ContentProvider介绍. ContentProvider翻译为“内容提供者”;. 定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;.