使用TextToSpeech朗读文字

1.使用TextToSpeech将一段文字转换为语音

android也可以实现把输入的文字朗读出来,使用到的是TextToSpeech,将一段文字转换为成语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。

 不过目前只支持5种语言:English、 French 、 German 、 Italian 和 Spanish。(真遗憾,没有Chinese)

具体代码实现

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="com.example.luuuzi01.voicebroadcast.MainActivity">
    <RelativeLayout
        android:layout_width="368dp"
        android:layout_height="495dp"
        tools:layout_editor_absoluteY="8dp"
        tools:layout_editor_absoluteX="8dp">
    <EditText
        android:id="@+id/et_voice_content"
        android:layout_width="368dp"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteY="0dp"
        tools:layout_editor_absoluteX="8dp"
        />
    <Button
        android:id="@+id/btn_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放"
        tools:layout_editor_absoluteY="0dp"
        tools:layout_editor_absoluteX="0dp"
        android:layout_marginTop="12dp"
        android:layout_below="@+id/et_voice_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    </RelativeLayout>
</android.support.constraint.ConstraintLayout>
mainActivity代码

package com.example.luuuzi01.voicebroadcast;


import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Locale;

/**
 * android也可以实现把输入的文字朗读出来,使用到的是TextToSpeech,
 * 不过目前只支持5种语言:English、 French 、 German 、 Italian 和 Spanish。(真遗憾,没有Chinese)
 */
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    private String tag;
    private EditText et_voice_content;
    private Button btn_play;
    //TextToSpeech类
    private TextToSpeech tts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tag="MainActivity";
        et_voice_content = (EditText) findViewById(R.id.et_voice_content);
        btn_play = (Button) findViewById(R.id.btn_play);
        /**
         *  1.创建对象  参数1(Context),参数2(TextToSpeech.OnInitListener)
         */
        
        // 朗读文字的类
        tts = new TextToSpeech(this, this);

        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 3.设置朗读参数 
                 */
                
                //设置音调,值越大声音越尖(女生),值越小则变为男生,1.0位常规
                tts.setPitch(1.0f);
                //设置语速
                tts.setSpeechRate(0.3f);
                if (et_voice_content.getText().length() >= 1) {
                   // Toast.makeText(MainActivity.this,et_voice_content.getText().toString(),Toast.LENGTH_SHORT).show();
                    /**
                     * 4.开始朗读
                     */
                    //开始朗读
                    tts.speak(et_voice_content.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
                } else {
                    Toast.makeText(MainActivity.this, "内容为空", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    /**
     * 2.初始化TextToSpeech引擎
     * status:SUCCESS或ERROR这2个值
     * setLanguage设置语言,帮助文档里面写了有22种
     * TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失。
     * TextToSpeech.LANG_NOT_SUPPORTED:表示语音不支持  -2
     * LANG_COUNTRY_AVAILABLE  1 表示本地语音或者方言可用,引申语音不可用
     */
    @Override
    public void onInit(int status) {
        if (status == tts.SUCCESS) {
            // Toast.makeText(MainActivity.this,"成功输出语音",
            // Toast.LENGTH_SHORT).show();
            // Locale loc1=new Locale("us");
            // Locale loc2=new Locale("china");
            //设置使用美式英语朗读
            int result1 = tts.setLanguage(Locale.US);
            //设置支持中文,实现不了只能用讯飞或者百度的sdk
            //int result2 = tts.setLanguage(Locale.CHINESE);
//            result2 == TextToSpeech.LANG_MISSING_DATA
//                    || result2 == TextToSpeech.LANG_NOT_SUPPORTED
            if (result1 == TextToSpeech.LANG_MISSING_DATA
                    || result1==TextToSpeech.LANG_NOT_SUPPORTED)
            {
                Toast.makeText(this, "数据丢失或不支持:"+result1+";", Toast.LENGTH_SHORT).show();
            }
        }


    }

    /**
     * 5.关闭tts
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (tts != null) {
            //停止
            tts.stop();
            //关闭
            tts.shutdown();
        }
    }
}布局效果

2.使用第三方科大讯飞平台的语音识别功能

使用步骤:
1.导入sdk:eclipse 将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:
android studio则导入到应该将so文件都放在main下面的jniLibs下面,如果没有这个文件夹,那么手动的创建


android studio导入


2.添加权限

<!--连接网络权限,用于执行云端语音能力 -->
<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"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
3.初始化

初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
下面就可以开始用其中的功能了

语音听写

代码:

//语音听写:将一段语音转换成文本,把语音中包含文字信息提取出来,并可以优先识别用户手机特有的联系人和个性化数据。
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//语音识别(SpeechRecognizer),包括听写、语法识别功能
				// 1.创建语音识别对象
				SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(mContext, null);
				//2.设置听写参数,
				mIat.setParameter(SpeechConstant.DOMAIN,"iat");
				mIat.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//语言
				mIat.setParameter(SpeechConstant.ACCENT,"mandarin");//口音:mandarin普通话
				//3.开始听写
				mIat.startListening(mReconListener);
			}
		});

//听写监听器
	private RecognizerListener mReconListener=new RecognizerListener() {
		
		//volume:音量值0~30,,data:音频数据
		@Override
		public void onVolumeChanged(int volume, byte[] data) {
			// TODO Auto-generated method stub
			
		}
		//听写结果回调接口(返回json接口)
		//一般情况下会通过onResult()接口多次返回结果,完整识别内容是多次结果的累加
		//关于json的代码详见demo中jsonParser类
		//isLast等于true时,会话结束
		@Override
		public void onResult(com.iflytek.cloud.RecognizerResult result, boolean isLast) {
			//打印返回结果
			Log.i(tag, "result:"+result.getResultString());
			Log.i(tag, "isLast:"+isLast);
		}
		//扩展接口
		@Override
		public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
			// TODO Auto-generated method stub
			
		}
		//会话发生错误时回调接口
		@Override
		public void onError(SpeechError error) {
			// 获取错误码描述,
			
		}
		//结束录音
		@Override
		public void onEndOfSpeech() {
			// TODO Auto-generated method stub
			
		}
		//开始录音
		@Override
		public void onBeginOfSpeech() {
			// TODO Auto-generated method stub
			
		}
	};

语音听写Dialog

	//语音听写Dialog
		findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//1.创建对象
			RecognizerDialog mDialog = new RecognizerDialog(mContext, null);
			//2.设置accent,language等参数
			mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//中文
			mDialog.setParameter(SpeechConstant.ACCENT,"mandarin");
			//3.设置回调接口
			mDialog.setListener(new RecognizerDialogListener() {
				
				@Override
				public void onResult(com.iflytek.cloud.RecognizerResult result, boolean isLast) {
					//打印返回结果
					Log.i(tag, "result:"+result.getResultString());
					Log.i(tag, "isLast:"+isLast);
					
				}
				
				@Override
				public void onError(SpeechError arg0) {
					// TODO Auto-generated method stub
					
				}
			});
			//4.显示Dialog
			mDialog.show();
				
			}
		});

语音合成:将一段文字读出来

		//语音合成(SpeechSynthesizer):将一段文字读出来
		findViewById(R.id.button3).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// 1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
				SpeechSynthesizer mTts = SpeechSynthesizer
						.createSynthesizer(mContext, null);
				// 2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
				// 设置发音人(更多在线发音人,用户可参见 附录12.2
//				语言(LANGUAGE,中文、英文等)
//				方言(ACCENT,中文的普通话,粤语等)
//				发音人特征(性别,年龄,语气)
//				语速(SPEED)
//				音量(VOLUME)
//				语调(PITCH)
//				音频采样率(SAMPLE_RATE)
				mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); // 设置发音人,可以根据这个设置发言的方言
				mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
				mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围0~100
				mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置云端
				// 设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
				// 保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
				// 仅支持保存为pcm和wav格式,如果不需要保存合成音频,注释该行代码
				mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");

				// 3.开始合成
				mTts.startSpeaking("床前明月光, 地上鞋两双, 一对狗男女,其中就有你!", null);
				
			}
		});

完整代码:

package com.luuuzi.d09;

import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.thirdparty.m;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;
import com.iflytek.speech.RecognizerResult;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {
	private String tag;
	private Context mContext;
	//语音识别
	//SpeechUtility mAsr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tag="MainActivity";
		mContext=this;
		//初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。
		//建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
		//将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
		// 请勿在“=”与appid之间添加任何空字符或者转义符
		SpeechUtility.createUtility(mContext, SpeechConstant.APPID +"=59ec07e0");
		
		//语音听写:将一段语音转换成文本,把语音中包含文字信息提取出来,并可以优先识别用户手机特有的联系人和个性化数据。
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//语音识别(SpeechRecognizer),包括听写、语法识别功能
				// 1.创建语音识别对象
				SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(mContext, null);
				//2.设置听写参数,
				mIat.setParameter(SpeechConstant.DOMAIN,"iat");
				mIat.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//语言
				mIat.setParameter(SpeechConstant.ACCENT,"mandarin");//口音:mandarin普通话
				//3.开始听写
				mIat.startListening(mReconListener);
			}
		});
		
		//语音听写Dialog
		findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//1.创建对象
			RecognizerDialog mDialog = new RecognizerDialog(mContext, null);
			//2.设置accent,language等参数
			mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//中文
			mDialog.setParameter(SpeechConstant.ACCENT,"mandarin");
			//3.设置回调接口
			mDialog.setListener(new RecognizerDialogListener() {
				
				@Override
				public void onResult(com.iflytek.cloud.RecognizerResult result, boolean isLast) {
					//打印返回结果
					Log.i(tag, "result:"+result.getResultString());
					Log.i(tag, "isLast:"+isLast);
					
				}
				
				@Override
				public void onError(SpeechError arg0) {
					// TODO Auto-generated method stub
					
				}
			});
			//4.显示Dialog
			mDialog.show();
				
			}
		});
		//语音合成(SpeechSynthesizer):将一段文字读出来
		findViewById(R.id.button3).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// 1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
				SpeechSynthesizer mTts = SpeechSynthesizer
						.createSynthesizer(mContext, null);
				// 2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
				// 设置发音人(更多在线发音人,用户可参见 附录12.2
//				语言(LANGUAGE,中文、英文等)
//				方言(ACCENT,中文的普通话,粤语等)
//				发音人特征(性别,年龄,语气)
//				语速(SPEED)
//				音量(VOLUME)
//				语调(PITCH)
//				音频采样率(SAMPLE_RATE)
				mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); // 设置发音人,可以根据这个设置发言的方言
				mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
				mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围0~100
				mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置云端
				// 设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
				// 保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
				// 仅支持保存为pcm和wav格式,如果不需要保存合成音频,注释该行代码
				mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");

				// 3.开始合成
				mTts.startSpeaking("床前明月光, 地上鞋两双, 一对狗男女,其中就有你!", null);
				
			}
		});
	}
	//听写监听器
	private RecognizerListener mReconListener=new RecognizerListener() {
		
		//volume:音量值0~30,,data:音频数据
		@Override
		public void onVolumeChanged(int volume, byte[] data) {
			// TODO Auto-generated method stub
			
		}
		//听写结果回调接口(返回json接口)
		//一般情况下会通过onResult()接口多次返回结果,完整识别内容是多次结果的累加
		//关于json的代码详见demo中jsonParser类
		//isLast等于true时,会话结束
		@Override
		public void onResult(com.iflytek.cloud.RecognizerResult result, boolean isLast) {
			//打印返回结果
			Log.i(tag, "result:"+result.getResultString());
			Log.i(tag, "isLast:"+isLast);
		}
		//扩展接口
		@Override
		public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
			// TODO Auto-generated method stub
			
		}
		//会话发生错误时回调接口
		@Override
		public void onError(SpeechError error) {
			// 获取错误码描述,
			
		}
		//结束录音
		@Override
		public void onEndOfSpeech() {
			// TODO Auto-generated method stub
			
		}
		//开始录音
		@Override
		public void onBeginOfSpeech() {
			// TODO Auto-generated method stub
			
		}
	};

}


布局:






  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值