顯示具有 android -- TTS 標籤的文章。 顯示所有文章
顯示具有 android -- TTS 標籤的文章。 顯示所有文章

2012年9月17日 星期一

IO: (6) + TTS 給英聽練習使用


IO + TTS : 給英聽練習使用


主程式:


//設計英語英聽口說練習
public class IO_TTS_EnglishSpeakingActivity extends Activity implements OnInitListener{
    /** Called when the activity is first created. */
private final String SDCARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
private final String FILE_PATH = "/fileio";
// private final String ENCODING = "UTF-8";
private File [] filesArray;
private File mDataPath;
private FileInputStream fis = null;
TextView tv;
ListView lv;
private String aFileName;
String [] strings;
 
private TextToSpeech mTTS;
private Button answerBtn;
private Button goBackBtn;
String result = "";
private static int NO_OF_QUESTIONS = 5;
private String [] questionsStr = new String [NO_OF_QUESTIONS];
private int flag; //判斷是否還留在原來的試卷裡
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tv= (TextView) findViewById(R.id.textView01);
//        tv.setMovementMethod(ScrollingMovementMethod.getInstance());
        
        mDataPath = new File (SDCARD_PATH + FILE_PATH);
        filesArray = mDataPath.listFiles();
        
        listFiles();//列出所有的檔案
        
        mTTS = new TextToSpeech(getApplicationContext(), this);//初始化
        answerBtn = (Button) findViewById(R.id.button2);
        answerBtn.setOnClickListener(answerListener);
        
        goBackBtn = (Button) findViewById(R.id.goBackButton);
        goBackBtn.setOnClickListener (goBackListener);
        
        flag = 1;
           
    }// end of onCreate
    
    
    //列出所有英聽的檔案,顯示在ListView上
    private void listFiles() {
    
    String fileNames = ""; // to receive every single file name
        for (int i = 0; i < filesArray.length; i++) {
        if (filesArray[i].isFile()) { //get rid of directories
        String tempStr = ""; //會多出入徑的字串
        tempStr = filesArray[i].toString();
        String strSub = ""; //to subtract the uneccessary part: /mnt/sdcard/fileio/ (19 個字元)
        strSub = tempStr.substring(19, tempStr.length()).toString();
        fileNames += strSub + "--";
        }
        }
        
        //Handle to subtraction of the final "--" in fileNames string
        String result = "";
        result = fileNames.substring(0, fileNames.length()-2);
        strings = TextUtils.split(result, "--");
        
        
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strings);
        lv = (ListView) findViewById(R.id.listView1);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(listener);
    
    }// end of listFiles ();
    
    
    
// 看答案的按鈕
private OnClickListener answerListener = new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

if (questionsStr[0] == null) {
Toast.makeText(Cq_IO01Activity.this, "請選擇試卷!",
Toast.LENGTH_SHORT).show();
tv.setMarqueeRepeatLimit(-1);
} else if (flag == 1){
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
Cq_IO01Activity.this,
android.R.layout.simple_list_item_1, questionsStr);
lv.setAdapter(adapter);
answerBtn.setText("不看題目");
answerBtn.setTextColor(Color.MAGENTA);
flag = 0;
} else if (flag == 0) {
listFiles();

answerBtn.setText("觀看題目");
answerBtn.setTextColor(Color.BLACK);
flag = 1;
}
}
};
    
    
  //按下按鈕回到原先列出全部英聽檔案的畫面
  private OnClickListener goBackListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mTTS != null) {
mTTS.stop();
}
listFiles();
tv.setText("請選擇下列試題卷練習英聽口說:");
tv.setTextColor(Color.RED);
tv.setMarqueeRepeatLimit(-1);
answerBtn.setText("觀看題目");
answerBtn.setTextColor(Color.BLACK);
}
};
  
  
    //選擇要唸出的檔案; 將內容的五個問題分別間隔唸出
    private OnItemClickListener listener = new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
aFileName = strings[position].toString();

tv.setText("正在播放 " + aFileName + " 練習,一共五題,每題播放兩次:");
tv.setTextColor(Color.GREEN);
tv.setMarqueeRepeatLimit(-1);
readSingleLine(aFileName); //讀出每個問題
}
};// end of listener
    
private void readSingleLine (String aFileName) {
try {
String mFileName = mDataPath + "/" + aFileName;
File fileContent = new File (mFileName);
fis = new FileInputStream(fileContent);
DataInputStream dis = new DataInputStream(fis);
for (int i = 0; i< NO_OF_QUESTIONS; i++) {
String tempStr = "";
tempStr = dis.readLine() + "\n";
questionsStr[i] = tempStr;
//讀出所選檔案的內容
mTTS.speak(tempStr, TextToSpeech.QUEUE_ADD, null); //用QUEUE_ADD可以再接其他的字串;queue_flush將無法做到                                                       //唸第一次
mTTS.playSilence(2000, TextToSpeech.QUEUE_ADD, null);   //停頓兩秒
mTTS.speak(tempStr, TextToSpeech.QUEUE_ADD, null);        //唸第二次
mTTS.playSilence(2000, TextToSpeech.QUEUE_ADD, null);   //停頓兩秒
mTTS.speak("Please answer now.", TextToSpeech.QUEUE_ADD, null); //請使用者回答
mTTS.playSilence(8000, TextToSpeech.QUEUE_ADD, null);                  //給予八秒的時間回答

}
} catch (Exception e) {
e.printStackTrace();
}
}// end of readSingleLine ()

@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
mTTS.setSpeechRate(0.9f);// 正常速度是 1.0f; 小過它會變慢
mTTS.speak("I'm ready for listening and speaking practice.", TextToSpeech.QUEUE_FLUSH, null);
}else {
System.out.println("Oops!");
}
}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mTTS.shutdown();
}


@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (mTTS != null) {
mTTS.stop();
}
}
}


**********************************
res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/sunset" >

    <TextView
        android:id="@+id/textView01"
        android:layout_width="350px"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:text="請選擇下列試題卷練習英聽口說:"
        android:ellipsize="marquee"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:textColor="#FF0000"
        android:textSize="22dp" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="75dp"
        android:layout_weight="0.70"
        
        android:divider="@drawable/list_item_divider"
        android:cacheColorHint="#00FF0000"
        android:dividerHeight="5px"    >
        
    </ListView>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        
        <Button
        android:id="@+id/button2"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="觀看題目" />
        
        <Button
        android:id="@+id/goBackButton"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="選擇新試卷" />
        
    </LinearLayout>

    
</LinearLayout>

*******************************
res/drawable/list_item_divider:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="line" >
   <stroke 
       android:width="1dp"
       android:color="#8F8F8F"
       android:dashWidth="1dp"
       android:dashGap="1dp"/>
</shape>







2012年8月17日 星期五

TextToSpeech




public final class Cq_TextToSpeechActivity extends Activity implements OnInitListener,OnClickListener, android.view.View.OnClickListener{
    /** Called when the activity is first created. */
private TextToSpeech tts;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        tts = new TextToSpeech(getApplicationContext(), this);
        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

 
  //關閉
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
tts.shutdown();
}



//開始
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS){
tts.speak("I'm ready!", TextToSpeech.QUEUE_FLUSH, null);
}else{
System.out.println("Oops!");
}
}

//處理TextToSpeech
public void onClick(final View v) {
// TODO Auto-generated method stub
TextView TextView01 = (TextView)findViewById(R.id.editText1);
tts.speak(TextView01.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
}


@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView TextView01 = (TextView)findViewById(R.id.editText1);
tts.speak(TextView01.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
}
}

*******************************

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Talk" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="top"
        android:text="I love Ta ta because she is cute, gorgeous, charming and intelligent. If you don't believe me, you may dial 0961234567. And ask for Ta ta Chen. You're going to love her.
        The following message is brought by CQ Corporation.">
     

    </EditText>

</LinearLayout>