文本到语音(TTS) – 安卓
我是新来的android平台。 现在我正在研究TTS(Text to Speech)
。如果我在TextArea中input文本,并且希望在单击发言button时将其转换为语音。
谁能帮我吗?
文本到语音是Android 1.6+内置的。 这里是一个简单的例子,如何做到这一点。
TextToSpeech tts = new TextToSpeech(this, this); tts.setLanguage(Locale.US); tts.speak("Text to say aloud", TextToSpeech.QUEUE_ADD, null);
更多信息: http : //android-developers.blogspot.com/2009/09/introduction-to-text-to-speech-in.html
以下是有关如何从Android SDK Manager下载示例代码的说明 :
-
启动Android SDKpipe理器。
一个。 在Windows上,双击Android SDK目录根目录下的SDK Manager.exe文件。
湾 在Mac或Linux上,打开terminal到Android SDK中的tools /目录,然后执行android sdk。
-
展开最新Android平台的软件包列表。
- select并下载SDK的Samples。 下载完成后,您可以在此位置find所有示例的源代码:
/ SDK /样品/ Android的版本/
(ie \android-sdk-windows\samples\android-16\ApiDemos\src\com\example\android\apis\app\TextToSpeechActivity.java)
package com.example.texttospeech; import java.util.Locale; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences.Editor; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { String text; EditText et; TextToSpeech tts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et=(EditText)findViewById(R.id.editText1); tts=new TextToSpeech(MainActivity.this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { // TODO Auto-generated method stub if(status == TextToSpeech.SUCCESS){ int result=tts.setLanguage(Locale.US); if(result==TextToSpeech.LANG_MISSING_DATA || result==TextToSpeech.LANG_NOT_SUPPORTED){ Log.e("error", "This Language is not supported"); } else{ ConvertTextToSpeech(); } } else Log.e("error", "Initilization Failed!"); } }); } @Override protected void onPause() { // TODO Auto-generated method stub if(tts != null){ tts.stop(); tts.shutdown(); } super.onPause(); } public void onClick(View v){ ConvertTextToSpeech(); } private void ConvertTextToSpeech() { // TODO Auto-generated method stub text = et.getText().toString(); if(text==null||"".equals(text)) { text = "Content not available"; tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); }else tts.speak(text+"is saved", TextToSpeech.QUEUE_FLUSH, null); } } <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="177dp" android:onClick="onClick" android:text="Button" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/button1" android:layout_centerHorizontal="true" android:layout_marginBottom="81dp" android:ems="10" > <requestFocus /> </EditText> </RelativeLayout>
尝试这个,它的简单:** speakout.xml:**
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#3498db" android:weightSum="1" android:orientation="vertical" > <TextView android:id="@+id/txtheader" android:layout_width="match_parent" android:layout_height="0dp" android:layout_gravity="center" android:layout_weight=".1" android:gravity="center" android:padding="3dp" android:text="Speak Out!!!" android:textColor="#fff" android:textSize="25sp" android:textStyle="bold" /> <EditText android:id="@+id/edtTexttoSpeak" android:layout_width="match_parent" android:layout_weight=".5" android:background="#fff" android:textColor="#2c3e50" android:text="Hi there!!!" android:padding="5dp" android:gravity="top|left" android:layout_height="0dp"/> <Button android:id="@+id/btnspeakout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight=".1" android:background="#e74c3c" android:textColor="#fff" android:text="SPEAK OUT"/> </LinearLayout>
和你的SpeakOut.java:
import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.view.View; import android.widget.Button; import android.widget.EditText; public class SpeakOut extends Activity implements OnInitListener { private TextToSpeech repeatTTS; Button btnspeakout; EditText edtTexttoSpeak; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.speakout); btnspeakout = (Button) findViewById(R.id.btnspeakout); edtTexttoSpeak = (EditText) findViewById(R.id.edtTexttoSpeak); repeatTTS = new TextToSpeech(this, this); btnspeakout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { repeatTTS.speak(edtTexttoSpeak.getText().toString(), TextToSpeech.QUEUE_FLUSH, null); } }); } @Override public void onInit(int arg0) { // TODO Auto-generated method stub } }
来源Parallelcodes.com的post
public class Texttovoice extends ActionBarActivity implements OnInitListener { private TextToSpeech tts; private Button btnSpeak; private EditText txtText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_texttovoice); tts = new TextToSpeech(this, this); // Refer 'Speak' button btnSpeak = (Button) findViewById(R.id.btnSpeak); // Refer 'Text' control txtText = (EditText) findViewById(R.id.txtText); // Handle onClick event for button 'Speak' btnSpeak.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { // Method yet to be defined speakOut(); } }); } private void speakOut() { // Get the text typed String text = txtText.getText().toString(); // If no text is typed, tts will read out 'You haven't typed text' // else it reads out the text you typed if (text.length() == 0) { tts.speak("You haven't typed text", TextToSpeech.QUEUE_FLUSH, null); } else { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } public void onDestroy() { // Don't forget to shutdown! if (tts != null) { tts.stop(); tts.shutdown(); } super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.texttovoice, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void onInit(int status) { // TODO Auto-generated method stub // TTS is successfully initialized if (status == TextToSpeech.SUCCESS) { // Setting speech language int result = tts.setLanguage(Locale.US); // If your device doesn't support language you set above if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { // Cook simple toast message with message Toast.makeText(getApplicationContext(), "Language not supported", Toast.LENGTH_LONG).show(); Log.e("TTS", "Language is not supported"); } // Enable the button - It was disabled in main.xml (Go back and // Check it) else { btnSpeak.setEnabled(true); } // TTS is not initialized properly } else { Toast.makeText(this, "TTS Initilization Failed", Toast.LENGTH_LONG) .show(); Log.e("TTS", "Initilization Failed"); } } //-------------------------------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="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" android:orientation="vertical" tools:ignore="HardcodedText" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="15dip" android:text="listen your text" android:textColor="#0587d9" android:textSize="26dip" android:textStyle="bold" /> <EditText android:id="@+id/txtText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dip" android:layout_marginTop="20dip" android:hint="Enter text to speak" /> <Button android:id="@+id/btnSpeak" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dip" android:enabled="false" android:text="Speak" android:onClick="speakout"/>
https://drive.google.com/open?id=0BzBKpZ4nzNzUR05nVUI1aVF6N1k
package com.keshav.speechtotextexample; import java.util.ArrayList; import java.util.Locale; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.os.Bundle; import android.speech.RecognizerIntent; import android.view.Menu; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TextView txtSpeechInput; private ImageButton btnSpeak; private final int REQ_CODE_SPEECH_INPUT = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtSpeechInput = (TextView) findViewById(R.id.txtSpeechInput); btnSpeak = (ImageButton) findViewById(R.id.btnSpeak); // hide the action bar getActionBar().hide(); btnSpeak.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { promptSpeechInput(); } }); } /** * Showing google speech input dialog * */ private void promptSpeechInput() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_prompt)); try { startActivityForResult(intent, REQ_CODE_SPEECH_INPUT); } catch (ActivityNotFoundException a) { Toast.makeText(getApplicationContext(), getString(R.string.speech_not_supported), Toast.LENGTH_SHORT).show(); } } /** * Receiving speech input * */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_CODE_SPEECH_INPUT: { if (resultCode == RESULT_OK && null != data) { ArrayList<String> result = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); txtSpeechInput.setText(result.get(0)); } break; } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } ==================================================== <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_gradient" android:orientation="vertical"> <TextView android:id="@+id/txtSpeechInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:textColor="@color/white" android:textSize="26dp" android:textStyle="normal" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="60dp" android:gravity="center" android:orientation="vertical"> <ImageButton android:id="@+id/btnSpeak" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:src="@drawable/ico_mic" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="@string/tap_on_mic" android:textColor="@color/white" android:textSize="15dp" android:textStyle="normal" /> </LinearLayout> </RelativeLayout> =============================================================== <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Speech To Text</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="speech_prompt">Say something…</string> <string name="speech_not_supported">Sorry! Your device doesn\'t support speech input</string> <string name="tap_on_mic">Tap on mic to speak</string> </resources> =============================================================== <resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme" parent="android:Theme.Light"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style> <!-- Application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> </style> </resources>