Friday, April 4, 2014

TextToSpeech

Thư viện phát âm của Android cho phép đọc văn bản với nhiều ngôn ngữ khác nhau. Để chỉ định ngôn ngữ mà thư viện sẽ đọc Android cung cấp phương thức setLanguage(Locale loc), để biết ngôn ngữ đang được đọc chúng ta gọi phương thức getLanguage (Locale loc) và muốn kiểm tra thư viện có hỗ trợ một ngôn ngữ nào đó hay không chúng ta có phương thức isLanguageAvailable (Locale loc). Ngoài ra, thư viện này còn rất nhiều thuộc tính và phương thức để điều khiển viêc đọc một đoạn ngôn ngữ (http://developer.android.com/reference/android/speech/tts/TextToSpeech.html).

Để tìm hiểu và ứng dụng TextToSpeech chúng ta cùng xây dựng một ứng dụng nhỏ cho phép đọc nội dung cung cấp qua EditText và có thể thay đổi chất giọng đọc và tốc độ đọc. Ứng dụng có giao diện như sau

Screenshot - 03_04_14 , 12_30_42 Screenshot - 03_04_14 , 12_32_19

Giao diện các bạn xem lại các bài trước (tùy biến giao diện) để thiết kế giao diện bên trên. Để có thể sử dụng thư viện này trong Activity chúng ta sẽ cài đặt interface OnInitListener và cài đặc phương thức onInit(int status) để khởi tạo thư việc.

1 @Override
2 public void onInit(int status) {
3 if (status == TextToSpeech.SUCCESS) {
4 btn.setEnabled(true);
5 } else {
6 btn.setEnabled(false);
7 }
8 // xác định chất giọng bình thường
9 tts.setPitch(1.0f);
10 // xác định tốc độ đọc bìn thường
11 tts.setSpeechRate(1.0f);
12 // chỉ định ngôn ngữ đọc là ngôn ngữ cài đặt của thiết bị
13 tts.setLanguage(Locale.getDefault());
14 }

Đối số status cho biết là có thể sử dụng thư viện TextToSpeech trên thiết bị hay không. Để đọc một một đoạn văn bản chúng ta gọi hàm tts.speak(str, TextToSpeech.QUEUE_FLUSH, null). Với Str là chuỗi cần đọc, TextToSpeech.QUEUE_FLUSH cách đọc chuỗi.

Tiếp theo, đón nhận thao tác nhấn chọn đọc để gọi hàm đọc văn bản.


1 btn.setOnClickListener(new View.OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 // đọc chuỗi trên EditText
5 String str = txt.getText().toString();
6 // nếu có chuỗi để đọc
7 if (!str.equals("")) {
8 txt.setError(null);
9 tts.speak(str, TextToSpeech.QUEUE_FLUSH, null);
10 } else {
11 // hiển thị thông báo lỗi theo EditText
12 txt.setError("Nhập chữ cần đọc");
13 }
14 }
15 });

Với hàm setError của EditText chúng ta hiển thị thống báo cho người dùng nhập đoạn cần đọc như giao diện đã trình bày bên trên. Chúng ta thấy rằng tốc độ đọc và chất giọng đọc đã được khơi tạo cho đối tượng khi nó được tạo ra. Vấn đề tiếp theo là khi chọn lại thông qua 2 SeekBar chúng ta sẽ cập nhật giá trị lại cho TextToSpeech.

Đăng ký đón nhận sự kiện khi người dùng thay đổi giá trị của SeekBar để cập nhật tốc độ đọc và chất giọng.

Như vậy mỗi khi giá trị của SeekBar thay đổi thì chúng ta cập nhật ngay cho đối tượng TextToSpeech vì vậy khi gọi hàm speak từ sự kiện click của nút phát âm thì 02 giá trị tốc độ đọc và chất giọng đã có
1 tocdo.setOnTouchListener(new OnTouchListener() {
2 @Override
3 public boolean onTouch(View v, MotionEvent event) {
4 // 0.5 đến 2.0, 1.0 là tốc độ bình thường
5 tts.setSpeechRate(tocdo.getProgress() * 0.1f);
6 return false;
7 }
8 });
9 chatgiong.setOnTouchListener(new OnTouchListener() {
10 @Override
11 public boolean onTouch(View v, MotionEvent event) {
12 // giọng trầm bổng
13 tts.setPitch(chatgiong.getProgress() * 0.1f);
14 return false;
15 }
16 });

Như vậy mỗi khi giá trị của SeekBar thay đổi thì chúng ta cập nhật ngay cho đối tượng TextToSpeech vì vậy khi gọi hàm speak từ sự kiện click của nút phát âm thì 02 giá trị tốc độ đọc và chất giọng đã có.


 


Còn tiếp ….

No comments:

Post a Comment

Translate