Java Android TTS如何在文本视图中显示说话的单词
当我说word时,如何将tts输出显示为文本视图。 实际上,我想在textview中显示tts输出字。我有一个编辑文本,我在其中输入一些数据,然后当点击播放按钮时,它会执行语音,但我也想在文本视图中显示说话的单词。我该怎么做?任何人都可以帮助我。我还考虑将文本转换为数组形式,然后传递,但是,我不认为这对其他解决方案有用吗? 我现在做的代码 例如:如果TTS正在说这个字符串:你好!当它达到“how”时,如何在文本视图中仅显示单个单词的“how”Java Android TTS如何在文本视图中显示说话的单词,java,android,button,text-to-speech,google-text-to-speech,Java,Android,Button,Text To Speech,Google Text To Speech,当我说word时,如何将tts输出显示为文本视图。 实际上,我想在textview中显示tts输出字。我有一个编辑文本,我在其中输入一些数据,然后当点击播放按钮时,它会执行语音,但我也想在文本视图中显示说话的单词。我该怎么做?任何人都可以帮助我。我还考虑将文本转换为数组形式,然后传递,但是,我不认为这对其他解决方案有用吗? 我现在做的代码 例如:如果TTS正在说这个字符串:你好!当它达到“how”时,如何在文本视图中仅显示单个单词的“how” Initializations();
Initializations();
textToSpeech = new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = textToSpeech.setLanguage(Locale.ENGLISH);
if (result == TextToSpeech.LANG_MISSING_DATA) {
Toast.makeText(MainActivity.this, "Sorry ! Language data missing", Toast.LENGTH_SHORT).show();
} else if (result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(MainActivity.this, "Sorry ! Language not supported", Toast.LENGTH_SHORT).show();
} else {
speek.setEnabled(true);
}
} else if (status == TextToSpeech.ERROR) {
Toast.makeText(MainActivity.this, "Sorry ! Text to speech can't be initialized", Toast.LENGTH_SHORT).show();
speek.setEnabled(false);
}
}
});
speek.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SpeekOut();
}
});
private void SpeekOut() {
String text = etTextToSpeech.getText().toString();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
} else {
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
试试看这个
在任何按钮单击中添加此项
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
Intent i = new Intent(MainService.ACTION);
if (isServiceRunning()) {
stopService(i);
((NotificationManager) getSystemService(NOTIFICATION_SERVICE))
.cancelAll();
} else {
startService(i);
runAsForeground();
}
try { startActivityForResult(intent, RESULT_SPEECH);
txtText.setText("");
} catch (ActivityNotFoundException a) {
Toast t = Toast.makeText(getApplicationContext(), "Opps! Your device doesn't support Speech to Text", Toast.LENGTH_SHORT); t.show();
}
//在这里运行一个前台函数
private void runAsForeground(){
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this, 0,
notificationIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setContentText("Night Mode")
.setContentIntent(pendingIntent).build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notification.flags = notification.flags
| Notification.FLAG_ONGOING_EVENT;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);
}
在文本视图中显示的步骤
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_SPEECH: {
if (resultCode == RESULT_OK && null != data) {
ArrayList<String> text = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
txtText.setText(text.get(0));
}
break;
}
}
}
@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
开关(请求代码){
个案结果(演讲):{
if(resultCode==RESULT\u OK&&null!=数据){
ArrayList文本=数据
.getStringArrayListExtra(识别器意图.额外结果);
setText(text.get(0));
}
打破
}
}
}
//主要服务
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
import android.os.PowerManager;
import android.provider.ContactsContract.PhoneLookup;
import android.util.Log;
public class MainService extends Service {
public static final String ACTION = "com.thul.CallRecorder.CALL_RECORD";
public static final String STATE = "STATE";
public static final String START = "START";
public static final String STORAGE = "STORAGE";
public static final String INCOMING = "INCOMING";
public static final String OUTGOING = "OUTGOING";
public static final String BEGIN = "BEGIN";
public static final String END = "END";
protected static final String TAG = MainService.class.getName();
protected static final boolean DEBUG = false;
private static final String AMR_DIR = "/callrec/";
private static final String IDLE = "";
private static final String INCOMING_CALL_SUFFIX = "_i";
private static final String OUTGOING_CALL_SUFFIX = "_o";
private Context cntx;
private volatile String fileNamePrefix = IDLE;
private volatile MediaRecorder recorder;
private volatile PowerManager.WakeLock wakeLock;
private volatile boolean isMounted = false;
private volatile boolean isInRecording = false;
@Override
public IBinder onBind(Intent i) {
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
this.cntx = getApplicationContext();
this.prepareAmrDir();
log("service create");
}
@Override
public void onDestroy() {
log("service destory");
this.stopRecording();
this.cntx = null;
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (null == intent || !ACTION.equals(intent.getAction())) {
return super.onStartCommand(intent, flags, startId);
}
String state = intent.getStringExtra(STATE);
String phoneNo = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
log("state: " + state + " phoneNo: " + phoneNo);
if (OUTGOING.equals(state)) {
fileNamePrefix = getContactName(this.getContext(), phoneNo)
+ OUTGOING_CALL_SUFFIX;
} else if (INCOMING.equals(state)) {
fileNamePrefix = getContactName(this.getContext(), phoneNo)
+ INCOMING_CALL_SUFFIX;
} else if (BEGIN.equals(state)) {
startRecording();
} else if (END.equals(state)) {
stopRecording();
} else if (STORAGE.equals(state)) {
String mountState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(mountState)) {
prepareAmrDir();
} else {
isMounted = false;
}
if (!isInRecording) {
stopSelf();
}
}
return START_STICKY;
}
public Context getContext() {
return cntx;
}
private void stopRecording() {
if (isInRecording) {
isInRecording = false;
recorder.stop();
recorder.release();
recorder = null;
releaseWakeLock();
stopSelf();
log("call recording stopped");
}
}
private String getDateTimeString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'_'HHmmss");
Date now = new Date();
return sdf.format(now);
}
private String getMonthString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date now = new Date();
return sdf.format(now);
}
private String getDateString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date now = new Date();
return sdf.format(now);
}
private String getTimeString() {
SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
Date now = new Date();
return sdf.format(now);
}
private void startRecording() {
if (!isMounted)
return;
stopRecording();
try {
File amr = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ AMR_DIR
+ getDateTimeString()
+ "_"
+ fileNamePrefix + ".amr");
log("Prepare recording in " + amr.getAbsolutePath());
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(amr.getAbsolutePath());
recorder.prepare();
recorder.start();
isInRecording = true;
acquireWakeLock();
log("Recording in " + amr.getAbsolutePath());
} catch (Exception e) {
Log.w(TAG, e);
}
}
private void prepareAmrDir() {
isMounted = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
if (!isMounted)
return;
File amrRoot = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + AMR_DIR);
if (!amrRoot.isDirectory())
amrRoot.mkdir();
}
private String getContactName(Context cntx, String phoneNo) {
if (null == phoneNo)
return "";
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(phoneNo));
ContentResolver cr = cntx.getContentResolver();
Cursor c = cr.query(uri, new String[] { PhoneLookup.DISPLAY_NAME },
null, null, null);
if (null == c) {
log("getContactName: The cursor was null when query phoneNo = "
+ phoneNo);
return phoneNo;
}
try {
if (c.moveToFirst()) {
String name = c.getString(0);
name = name.replaceAll("(\\||\\\\|\\?|\\*|<|:|\"|>)", "");
log("getContactName: phoneNo: " + phoneNo + " name: " + name);
return name;
} else {
log("getContactName: Contact name of phoneNo = " + phoneNo
+ " was not found.");
return phoneNo;
}
} finally {
c.close();
}
}
private void log(String info) {
if (DEBUG && isMounted) {
File log = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ AMR_DIR
+ "log_"
+ getMonthString()
+ ".txt");
try {
BufferedWriter out = new BufferedWriter(new FileWriter(log,
true));
try {
synchronized (out) {
out.write(getDateString()+getTimeString());
out.write(" ");
out.write(info);
out.newLine();
}
} finally {
out.close();
}
} catch (IOException e) {
Log.w(TAG, e);
}
}
}
private void acquireWakeLock() {
if (wakeLock == null) {
log("Acquiring wake lock");
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this
.getClass().getCanonicalName());
wakeLock.acquire();
}
}
private void releaseWakeLock() {
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
wakeLock = null;
log("Wake lock released");
}
}
}
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入android.app.Service;
导入android.content.ContentResolver;
导入android.content.Context;
导入android.content.Intent;
导入android.database.Cursor;
导入android.media.MediaRecorder;
导入android.net.Uri;
导入android.os.Environment;
导入android.os.IBinder;
导入android.os.PowerManager;
导入android.provider.ContactsContract.PhoneLookup;
导入android.util.Log;
公共类MainService扩展服务{
public static final String ACTION=“com.thul.CallRecorder.CALL\u RECORD”;
公共静态最终字符串STATE=“STATE”;
公共静态最终字符串START=“START”;
公共静态最终字符串STORAGE=“STORAGE”;
公共静态最终字符串INCOMING=“INCOMING”;
公共静态最终字符串OUTGOING=“OUTGOING”;
公共静态最终字符串BEGIN=“BEGIN”;
公共静态最终字符串END=“END”;
受保护的静态最终字符串标记=MainService.class.getName();
受保护的静态最终布尔调试=false;
私有静态最终字符串AMR_DIR=“/callrec/”;
私有静态最终字符串IDLE=“”;
私有静态最终字符串传入\u调用\u后缀=“\u i”;
私有静态最终字符串传出\u调用\u后缀=“\u o”;
私有上下文cntx;
私有易失性字符串fileNamePrefix=空闲;
专用易失性媒体记录器;
私有易失性PowerManager.WakeLock WakeLock;
private volatile boolean isMounted=false;
私有易失性布尔值isInRecording=false;
@凌驾
公共IBinder onBind(意向一){
返回null;
}
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
this.cntx=getApplicationContext();
这个.prepareAmrDir();
日志(“服务创建”);
}
@凌驾
公共空间{
日志(“服务破坏”);
这个。停止录制();
this.cntx=null;
super.ondestory();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
if(null==intent | |!ACTION.equals(intent.getAction())){
返回super.onStartCommand(intent、flags、startId);
}
字符串状态=intent.getStringExtra(状态);
String phoneNo=intent.getStringExtra(intent.EXTRA\u电话号码);
日志(“状态:+状态+”电话号码:+电话号码);
if(输出等于(状态)){
fileNamePrefix=getContactName(this.getContext(),phoneNo)
+传出呼叫后缀;
}else if(传入的.equals(状态)){
fileNamePrefix=getContactName(this.getContext(),phoneNo)
+传入呼叫后缀;
}else if(BEGIN.equals(state)){
startRecording();
}else if(结束等于(状态)){
停止录制();
}else if(STORAGE.equals(state)){
字符串mountState=Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(mountState)){
prepareAmrDir();
}否则{
isMounted=错误;
}
如果(!isInRecording){
stopSelf();
}
}
返回开始时间;
}
公共上下文getContext(){
返回cntx;
}
私有void stopRecording(){
如果(正在记录){
isInRecording=false;
录音机。停止();
记录器。释放();
记录器=空;
释放WakeLock();
stopSelf();
日志(“呼叫记录停止”);
}
}
私有字符串getDateTimeString(){
SimpleDateFormat sdf=新的SimpleDateFormat(“yyyyymmdd”HHmmss);
现在日期=新日期();
返回sdf.format(现在);
}
私有字符串getMonthString(){
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMM”);
现在日期=新日期();
返回sdf.format(现在);
}
私有字符串getDateString(){
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMMdd”);
现在日期=新日期();
返回sdf.format(现在);
}
私有字符串getTimeString(){
SimpleDataFormat sdf=新的SimpleDataFormat(“HHmmss”);
现在日期=新日期();
返回sdf.format(现在);
}
私有无效开始记录(){
如果(!isMounted)
返回;
停止录制();
试一试{
File amr=新文件(Environment.getExternalStorageDirectory()
private boolean isServiceRunning() {
ActivityManager myManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ArrayList<RunningServiceInfo> runningService = (ArrayList<RunningServiceInfo>) myManager
.getRunningServices(30);
for (int i = 0; i < runningService.size(); i++) {
if (runningService.get(i).service.getClassName().equals(
MainService.class.getName())) {
return true;
}
}
return false;
}