Android 简单的语音播报
不解释快上车
Main.class
package com.example.myapp; import android.app.AlertDialog;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.TextToSpeechService;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast; import java.util.Date;
import java.util.HashMap;
import java.util.Locale; /**
* 语音播报
* 局限不支持中文
*/
public class Main extends AppCompatActivity { private static final String TAG = "Main";
private TextToSpeech mSpeech = null;
private EditText edit = null;
private String choosedLanguage;
private RadioButton english, chainese, german, french, taiWan;
private RadioGroup languageGroup; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initUI();
initLanguageList();
mSpeech = new TextToSpeech(Main.this, new TTSListener()); // langs = getResources().getStringArray(R.array.languages); // 得到语言数组
// langSpinner = (Spinner) findViewById(R.id.spinner);
// edit = (EditText) findViewById(R.id.edit);
// btn = (Button) findViewById(R.id.btn);
// btn.setOnClickListener(new BtnListener());
//
// for (int i = 0; i < langs.length; i++) {
// langList.add(langs[i]);
// }
// // 设置下拉框的适配器和样式
// langAdapter = new ArrayAdapter<String>(Main.this,
// android.R.layout.simple_spinner_item, langList);
// langAdapter
// .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// langSpinner.setAdapter(langAdapter);
//
// // 下拉框监听器
// langSpinner
// .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// @Override
// public void onItemSelected(AdapterView<?> adapter,
// View view, int position, long id) {
// // TODO Auto-generated method stub
// curLang = (String) langSpinner.getAdapter().getItem(
// (int) id);
// if(mSpeech != null)
// {
// mSpeech.stop();
// mSpeech.shutdown();
// mSpeech = null;
// }
// // 创建TTS对象
// mSpeech = new TextToSpeech(Main.this, new TTSListener());
// Toast.makeText(Main.this, "select = " + curLang, Toast.LENGTH_SHORT).show();
// }
//
// @Override
// public void onNothingSelected(AdapterView<?> arg0) {
// // TODO Auto-generated method stub
//
// }
// });
// } // private int SetLanguage(String lang) {
// int result = 0;
// if (lang.equals("CANADA")) {
// result = mSpeech.setLanguage(Locale.CANADA);
// } else if (lang.equals("CANADA_FRENCH")) {
// result = mSpeech.setLanguage(Locale.CANADA_FRENCH);
// } else if (lang.equals("CHINA")) {
// result = mSpeech.setLanguage(Locale.CHINA);
// } else if (lang.equals("CHINESE")) {
// result = mSpeech.setLanguage(Locale.CHINESE);
// } else if (lang.equals("ENGLISH")) {
// result = mSpeech.setLanguage(Locale.ENGLISH);
// } else if (lang.equals("FRANCE")) {
// result = mSpeech.setLanguage(Locale.FRANCE);
// } else if (lang.equals("FRENCH")) {
// result = mSpeech.setLanguage(Locale.FRENCH);
// } else if (lang.equals("GERMAN")) {
// result = mSpeech.setLanguage(Locale.GERMAN);
// } else if (lang.equals("GERMANY")) {
// result = mSpeech.setLanguage(Locale.GERMANY);
// } else if (lang.equals("ITALIAN")) {
// result = mSpeech.setLanguage(Locale.ITALIAN);
// } else if (lang.equals("ITALY")) {
// result = mSpeech.setLanguage(Locale.ITALY);
// } else if (lang.equals("JAPAN")) {
// result = mSpeech.setLanguage(Locale.JAPAN);
// } else if (lang.equals("JAPANESE")) {
// result = mSpeech.setLanguage(Locale.JAPANESE);
// } else if (lang.equals("KOREA")) {
// result = mSpeech.setLanguage(Locale.KOREA);
// } else if (lang.equals("KOREAN")) {
// result = mSpeech.setLanguage(Locale.KOREAN);
// } else if (lang.equals("PRC")) {
// result = mSpeech.setLanguage(Locale.PRC);
// } else if (lang.equals("ROOT")) {
// result = mSpeech.setLanguage(Locale.ROOT);
// } else if (lang.equals("SIMPLIFIED_CHINESE")) {
// result = mSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
// } else if (lang.equals("TAIWAN")) {
// result = mSpeech.setLanguage(Locale.TAIWAN);
// } else if (lang.equals("TRADITIONAL_CHINESE")) {
// result = mSpeech.setLanguage(Locale.TRADITIONAL_CHINESE);
// } else if (lang.equals("UK")) {
// result = mSpeech.setLanguage(Locale.UK);
// } else if (lang.equals("US")) {
// result = mSpeech.setLanguage(Locale.US);
// }
// return result;
// }
//
// private class TTSListener implements OnInitListener {
//
// @Override
// public void onInit(int status) {
// // TODO Auto-generated method stub
// if (status == TextToSpeech.SUCCESS) {
// //int result = mSpeech.setLanguage(Locale.ENGLISH);
// int result = SetLanguage(curLang);
// //如果打印为-2,说明不支持这种语言
// Toast.makeText(Main.this, "-------------result = " + result, Toast.LENGTH_LONG).show();
// if (result == TextToSpeech.LANG_MISSING_DATA
// || result == TextToSpeech.LANG_NOT_SUPPORTED) {
// System.out.println("-------------not use");
// } else {
// mSpeech.speak("i love you", TextToSpeech.QUEUE_FLUSH, null);
// }
// }
// }
//
// }
//
// private class BtnListener implements OnClickListener {
//
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
// mSpeech.speak(edit.getText().toString(), TextToSpeech.QUEUE_FLUSH,
// null);
// }
//
// }
//
// @Override
// protected void onDestroy() {
// // TODO Auto-generated method stub
// if (mSpeech != null) {
// mSpeech.stop();
// mSpeech.shutdown();
// mSpeech = null;
// }
// super.onDestroy();
// }
//
//}
} private void initUI() {
edit = findViewById(R.id.test_text);
languageGroup = findViewById(R.id.language_Group);
english = findViewById(R.id.language_English);
chainese = findViewById(R.id.language_Chainese);
german = findViewById(R.id.language_German);
french = findViewById(R.id.language_French);
taiWan = findViewById(R.id.language_TaiWan);
// View.OnClickListener handle = new View.OnClickListener(){
// public void onClick(View v){
// switch(v.getId()){
// case R.id.language_English:
// choosedLanguage="英文";
// break;
// case R.id.language_Chainese:
// choosedLanguage="中文";
// break;
// case R.id.language_German:
// choosedLanguage="德语";
// break;
// case R.id.language_French:
// choosedLanguage="法语";
// break;
// }
//
// }
// };
// english.setOnClickListener(handle);
// chainese.setOnClickListener(handle);
// german.setOnClickListener(handle);
// french.setOnClickListener(handle);
} private void initLanguageList() { SharedData.languageList.put("英语", Locale.ENGLISH);
SharedData.languageList.put("中文", Locale.CHINESE);
SharedData.languageList.put("德语", Locale.GERMAN);
SharedData.languageList.put("法语", Locale.FRENCH);
SharedData.languageList.put("台湾话", Locale.TAIWAN);
} public void openAudioFile(View view) {
choosedLanguage = getLanguage(languageGroup);
int supported = mSpeech.setLanguage(SharedData.languageList.get(choosedLanguage));
mSpeech.setSpeechRate(SharedData.voice_speed);
mSpeech.setPitch(SharedData.voice_pitch); Log.i(TAG, "选择语言: " + choosedLanguage + "--" + SharedData.languageList.get(choosedLanguage));
//mSpeech.setAudioAttributes(new AudioAttributes());
// mSpeech.setVoice(new Voice(null,Locale.US,Voice.QUALITY_HIGH,Voice.LATENCY_NORMAL,false,null));
if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
//语言设置失败
Log.i(TAG, "语言设置失败: " + choosedLanguage);
} else {
Log.i(TAG, "语言设置成功: " + choosedLanguage);
} String tempStr = edit.getText().toString();
mSpeech.speak(tempStr, TextToSpeech.QUEUE_FLUSH, null);
Log.i(TAG, "测试文本: " + tempStr);
Log.i(TAG, "当前语速: " + SharedData.voice_speed + ", 最快语速1.5");
Log.i(TAG, "当前音调:" + SharedData.voice_pitch + ", 最高音调2.0");
//Log.i(TAG, "test: 执行了");
} //保存音频文件
public void saveAudioFile(View view) {
HashMap<String, String> myHashRender = new HashMap<>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, edit.getText().toString());
mSpeech.synthesizeToFile(edit.getText().toString(), myHashRender,
"/mnt/sdcard/" + new Date().toString().replace(" ", "_").trim() + ".wav");
Log.i(TAG, "saveAudioFile: " + "/mnt/sdcard/" + new Date().toString().replace(" ", "_").trim() + ".wav" + "文件保存成功");
Toast.makeText(this, "文件保存成功", Toast.LENGTH_SHORT).show();
} private String getLanguage(RadioGroup languageGroup) {
int choosedButtonID = languageGroup.getCheckedRadioButtonId();
String tempStr = "";
if (choosedButtonID == english.getId()) {
tempStr = "英语";
} else if (choosedButtonID == chainese.getId()) {
tempStr = "中文";
} else if (choosedButtonID == german.getId()) {
tempStr = "德语";
} else if (choosedButtonID == french.getId()) {
tempStr = "法语";
} else if (choosedButtonID == taiWan.getId()) {
tempStr = "台湾话";
} else { }
return tempStr;
} //增加音量
public void increVoice(View view) {
if (SharedData.voice_speed >= 1.5f) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("速度已经最快,无法调整");
dialog.show();
} else {
SharedData.voice_speed += 0.1f;
}
} //减小音量
public void decreVoice(View view) {
if (SharedData.voice_speed <= 0.1f) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("速度已经最慢,无法调整");
dialog.show();
} else {
SharedData.voice_speed -= 0.1f;
}
} //升高音调
public void increPitch(View view) {
if (SharedData.voice_pitch >= 2.0f) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("音调已经最高,无法调整");
dialog.show();
} else {
SharedData.voice_pitch += 0.1f;
}
} //减低音调
public void decrePitch(View view) {
if (SharedData.voice_pitch <= 0.1f) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("音调已经最低,无法调整");
dialog.show();
} else {
SharedData.voice_pitch -= 0.1f;
}
} private class TTSListener implements OnInitListener {
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
// int supported = mSpeech.setLanguage(Locale.US);
// if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
// Toast.makeText(Main.this, "不支持当前语言!", Toast.LENGTH_SHORT).show();
// Log.i(TAG, "onInit: 支持当前选择语言");
// }else{
//
// }
Log.i(TAG, "onInit: TTS引擎初始化成功");
} else {
Log.i(TAG, "onInit: TTS引擎初始化失败");
}
}
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
if (mSpeech != null) {
mSpeech.stop();
mSpeech.shutdown();
mSpeech = null;
}
super.onDestroy();
} // private int SetLanguage(String lang) {
// int result = 0;
// if (lang.equals("CANADA")) {
// result = mSpeech.setLanguage(Locale.CANADA);
// } else if (lang.equals("CANADA_FRENCH")) {
// result = mSpeech.setLanguage(Locale.CANADA_FRENCH);
// } else if (lang.equals("CHINA")) {
// result = mSpeech.setLanguage(Locale.CHINA);
// } else if (lang.equals("CHINESE")) {
// result = mSpeech.setLanguage(Locale.CHINESE);
// } else if (lang.equals("ENGLISH")) {
// result = mSpeech.setLanguage(Locale.ENGLISH);
// } else if (lang.equals("FRANCE")) {
// result = mSpeech.setLanguage(Locale.FRANCE);
// } else if (lang.equals("FRENCH")) {
// result = mSpeech.setLanguage(Locale.FRENCH);
// } else if (lang.equals("GERMAN")) {
// result = mSpeech.setLanguage(Locale.GERMAN);
// } else if (lang.equals("GERMANY")) {
// result = mSpeech.setLanguage(Locale.GERMANY);
// } else if (lang.equals("ITALIAN")) {
// result = mSpeech.setLanguage(Locale.ITALIAN);
// } else if (lang.equals("ITALY")) {
// result = mSpeech.setLanguage(Locale.ITALY);
// } else if (lang.equals("JAPAN")) {
// result = mSpeech.setLanguage(Locale.JAPAN);
// } else if (lang.equals("JAPANESE")) {
// result = mSpeech.setLanguage(Locale.JAPANESE);
// } else if (lang.equals("KOREA")) {
// result = mSpeech.setLanguage(Locale.KOREA);
// } else if (lang.equals("KOREAN")) {
// result = mSpeech.setLanguage(Locale.KOREAN);
// } else if (lang.equals("PRC")) {
// result = mSpeech.setLanguage(Locale.PRC);
// } else if (lang.equals("ROOT")) {
// result = mSpeech.setLanguage(Locale.ROOT);
// } else if (lang.equals("SIMPLIFIED_CHINESE")) {
// result = mSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
// } else if (lang.equals("TAIWAN")) {
// result = mSpeech.setLanguage(Locale.TAIWAN);
// } else if (lang.equals("TRADITIONAL_CHINESE")) {
// result = mSpeech.setLanguage(Locale.TRADITIONAL_CHINESE);
// } else if (lang.equals("UK")) {
// result = mSpeech.setLanguage(Locale.UK);
// } else if (lang.equals("US")) {
// result = mSpeech.setLanguage(Locale.US);
// }
// return result;
// } } XML 文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".Main"> <EditText
android:id="@+id/test_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textSize="20dp" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="openAudioFile"
android:text="播放合成语音"
android:textSize="20dp" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:onClick="saveAudioFile"
android:text="保存合成音频"
android:textSize="20dp" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="160dp"
android:orientation="horizontal"> <RadioGroup
android:id="@+id/language_Group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="bottom"
android:orientation="vertical"
android:paddingTop="2.0dip"> <RadioButton
android:id="@+id/language_English"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="英文" /> <RadioButton
android:id="@+id/language_Chainese"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="中文" /> <RadioButton
android:id="@+id/language_German"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="德语" /> <RadioButton
android:id="@+id/language_French"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="法语" /> <RadioButton
android:id="@+id/language_TaiWan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="台湾话" />
</RadioGroup> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="80dp"
android:orientation="horizontal"> <Button
android:id="@+id/voice_incre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="increVoice"
android:text="加快语速"
android:textSize="20dp" /> <Button
android:id="@+id/voice_decre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="decreVoice"
android:text="减慢语速"
android:textSize="20dp" /> </LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="80dp"
android:orientation="horizontal"> <Button
android:id="@+id/pitch_incre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="increPitch"
android:text="升高音调"
android:textSize="20dp" /> <Button
android:id="@+id/pitch_decre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="decrePitch"
android:text="降低音调"
android:textSize="20dp" /> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout>
SharedData 工具类
package com.example.myapp; import java.util.HashMap;
import java.util.Locale;
import java.util.Map; /**
* author:why
* created on: 2018/6/5 11:28
* description:
*/
public class SharedData {
//语速
public static float voice_speed = 0.5f;
//音调
public static float voice_pitch = 1.0f;
//
public static Map<String, Locale> languageList = new HashMap<String, Locale>(); } AndroidManifest.xml配置
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
原创:https://blog.csdn.net/hfut_why/article/details/80587630
Android 简单的语音播报的更多相关文章
- Android自带语音播报+讯飞语音播报封装(直接用)
一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...
- Android语音播报、后台播报、语音识别
Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...
- Android短信收到,语音播报
发送短信功能界面 /** * 发送短信Demo * * @description: * @author ldm * @date 2016-4-22 上午9:07:53 */ public class ...
- Android文字转语音引擎(TTS)使用
百度网盘下载地址 密码:3si0资源来源:https://blog.csdn.net/Sqq_yj/article/details/82460580?utm_source=blogxgwz4 简单比较 ...
- SpeechLib 语音播报
SpeechLib这的dll专门用来播放语音,能够识别英语.简体和繁体.并且可以播放声音文件,支持WAV格式,但不支持MP3.在报警场合下已经够用了. 基本播放语音及文件.支持异步. using Sy ...
- Unity3D 实现简单的语音聊天 [iOS版本]
现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...
- Android讯飞语音云语音听写学习
讯飞语音云语音听写学习 这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...
- 语音合成,语音播报功能(系统)-b
第一次接触语音合成,只实现了很简单的功能,记录一下,以后免得去网上四处找资料 最近在做高德地图导航的时候有个语音播报的功能,高德sdk已经提供了要语音的字符串.我要做的就是把这些字符串读出声音来即可. ...
- 实现百度地图导航Demo的语音播报功能
上文中实现了在本地导入百度地图导航Demo,那么在此基础上如何实现导航的语音播报呢? 一.为该应用申请语音播报(也叫注册) http://developer.baidu.com/map/index.p ...
随机推荐
- 条款十五: 让operator=返回*this的引用
c++程序员经常犯的一个错误是让operator=返回void,这好象没什么不合理的,但它妨碍了连续(链式)赋值操作,所以不要这样做. 一般情况下几乎总要遵循operator=输入和返回的都是类对象的 ...
- reactjs 视频教程
近期玩了一下react,感觉挺不错的,搜了一下没有看到什么视频教程,于是自己便录制了几个入门视频.希望能够帮到大家.已经上传土豆了,能够点击以下的链接查看. http://www.tudou.com/ ...
- TextView设置成仅仅读
TextView设置成仅仅读 方法一:代理 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { return NO; } 方法二:设 ...
- linux文件系统的权限简单介绍
linux系统下,文件的权限是这样表示的: - --- --- --- 一共用10位的二进制进行表示,其中 位置 0 : - :文件 d :目录剩下的9个位置:位置1-3 当前用户(应 ...
- HDU 5428 分解质因数
The F ...
- Kentico中的skin.css的加载
kentico7中有如下的css引用 第一行的css是 SELECT * FROM dbo.CMS_CssStylesheet表中的css 后面2个对应到的是Kentico7\App_Themes\ ...
- 【Silverlight】Bing Maps学习系列(三):如何控制地图
[Silverlight]Bing Maps学习系列(三):如何控制地图 本篇主要介绍如何对地图的一些常用控制操作,包括地图加载模式.根据精度和纬度定位.变焦程度等. 一.动态设置地图加载模式 在本系 ...
- luogu 3951 小凯的疑惑
noip2017 D1T1 小凯的疑惑 某zz选手没有看出这道结论题,同时写出了exgcd却不会用,只能打一个哈希表骗了30分 题目大意: 两个互质的正整数a和b,求一个最小的正整数使这个数无法表示为 ...
- POJ3675 Telescope 圆和多边形的交
POJ3675 用三角剖分可以轻松搞定,数据也小 随便AC. #include<iostream> #include<stdio.h> #include<stdlib.h ...
- 函数bsxfun,两个数组间元素逐个计算的二值操作
转自http://www.cnblogs.com/rong86/p/3559616.html 函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间 ...