Game Studio
Liên kế mạng xã hội

Game Studio


Chuyển văn bản thành giọng nói trong Cocos2d-x

Giới thiệu

Bài viết này nhằm mục đích biến đổi text thành giọng nói (Text To Speech = TTS) trên nền tảng android với Cocos2d-x.

Tiền đề bài viết

Được sự gợi ý của Kevin La, tôi viết 1 bài viết để hướng dẫn bạn nào chưa biết hay muốn tham khảo về TTS trong quá trình làm game bằng engine Cocos2d-x.

Trong quá trình làm 1 ứng dụng nhỏ bằng Cocos2d-x và cần tính năng TTS trong ứng dụng, nhưng rất khó để tìm thấy được hướng dẫn cụ thể. Nay tôi đã làm được và muốn chia sẻ với những ai muốn nghiên cứu để áp dụng vào dự án của các bạn mà không cần phải mất nhiều thời gian nghiên cứu thêm.

Đối tượng hướng đến

Đối tượng hướng đến của bài viết này là các bạn biết về Cocos2d-x và Eclipse.

Hiện thực

Tạo project với Cocos2d-x

Tôi bắt đầu tạo project mới trong Cocos2d-x với dòng lệnh quen thuộc và đợi vài phút để quá trình tạo mới thành công.

Ngoài ra, các bạn có thể tham khảo 2 bài sau:

  • http://www.stdio.vn/articles/read/186-cai-dat-cocos2d-x-va-khoi-tao-project-tren-windows
  • http://www.stdio.vn/articles/read/218-cai-dat-cocos2d-x-v34-va-build-project-tren-android

Import project vào Eclipse

Project Cocos2d-x đã tạo xong, bây giờ chúng ta mở eclipse lên và chọn File → Import sau đó chọn như hình bên dưới và chọn Next. Sau đó chúng ta sẽ trỏ đường dẫn đến project vừa tạo để import vào Eclipse. Ví dụ: D:\LapTrinhCocos2dx\ProjectsCocos\CreationGame\DemoTTS

Thêm thư viện Cocos2d-x vào project

Sau khi import project mới tạo xong thì ta cũng include thư viện Cocos2d-x vào, lặp lại bước ở trên và lần này đường dẫn đến nơi cài đặt thư mục Cocos2dx. Ví dụ trên máy tôi là:  D:\LapTrinhCocos2dx\cocos2d-x-3.5

Sau khi import xong chúng ta sẽ có hình như sau:

Thêm TTS vào project

Tiếp theo là chúng ta sẽ tạo thư viện TTS để tích hợp vào project Cocos2d-x. Trong cửa sổ Eclipse chọn new project và chọn Android Application project như hình bên dưới và nhấn Next.

Tiếp theo lick chọn vào Mark thí project á a library và click Next → Next → Finish.

Kiểm tra việc cài đặt

Sau khi tạo xong các ban chọn vào project và vô Properties để check lại xem tạo project thư viện đã đúng chưa. Nếu có check có Library như hình bên dưới là thành công.

Tiếp theo ta tìm file vào TTSpeech.java trong thư mục src để viết code cho thư viện.

  1. package com.TTSUS;
  2. import java.util.Locale;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.speech.tts.TextToSpeech;
  6. import android.speech.tts.TextToSpeech.OnInitListener;
  7. import android.content.Context;
  8.  
  9. public class TTSpeech extends Activity implements OnInitListener{
  10.  
  11. private TextToSpeech texttospeech = null;
  12. public TTSpeech(Context context)
  13. {
  14. super();
  15. if(texttospeech == null)
  16. texttospeech = new TextToSpeech(context, this);
  17. }
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. }
  22.  
  23. @Override
  24. public void onInit(int status) {
  25. // TODO Auto-generated method stub
  26. }
  27. public void SpeakString(String string)
  28. {
  29. if(!texttospeech.isSpeaking());
  30. {
  31. texttospeech.speak(string, TextToSpeech.QUEUE_FLUSH, null);
  32. texttospeech.setLanguage(Locale.US);
  33. texttospeech.setPitch((float) 1.2);
  34. texttospeech.setSpeechRate(1);
  35. }
  36. }
  37. }

Và dưới đây là hình ảnh của bước trên:

Sau khi khởi tạo project xong, bây giờ ta sẽ phân tích code bên trên

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. }
  5.  
  6. @Override
  7. public void onInit(int status) {
  8. // TODO Auto-generated method stub
  9. }

Ở hàm onCreate và hàm onInit thì ta nên xóa hết không cần viết gì ở đây vì đây là bài demo cho TTS còn bạn nào có thêm thắc gì trong đó thì mở rộng ra.

  1. private TextToSpeech texttospeech = null;
  2. public TTSpeech(Context context)
  3. {
  4. super();
  5. if(texttospeech == null)
  6. texttospeech = new TextToSpeech(context, this);
  7. }

Đoạn code này dùng cho Cocos2d-x gọi để truyền context cho việc khởi tạo 1 biến texttospeech.

  1. public void SpeakString(String string)
  2. {
  3. if(!texttospeech.isSpeaking());
  4. {
  5. texttospeech.speak(string, TextToSpeech.QUEUE_FLUSH, null);
  6. texttospeech.setLanguage(Locale.US);
  7. texttospeech.setPitch((float) 1.2);
  8. texttospeech.setSpeechRate(1);
  9. }
  10. }

Hàm này dùng để đọc 1 đoạn văn bản thành tiếng nói được gọi khi làm 1 động tác bên hàm Cocos2d-x của chúng ta. Các bạn có thể tham khảo thêm ở ngoài về các tham số .speak, .setLanguage, setPitch và .setSpeechRate.

Đến đây là ta đã tạo xong thư viện TTS rồi. Giờ ta sẽ ứng dụng thư viện vào trong project Cocos2d-x.

Trong cửa sổ Eclipse ta chọn vào project cocos lúc nãy import vào và chọn Properties.

Chúng ta chưa thấy gì trong thư viện, nên ta sẽ tiến hành import các thư viện vào. Nhấn vào button Add...

Sau khi bấm nút Add ta sẽ chọn libcocos2dx và nhấn ok, tiếp theo ta chọn add TTSUS vừa tạo xong sẽ được như hình trên.

Tiếp theo vào thư mục tạo project cocos để kiểm tra xem đã inlclude đúng chưa bằng cách vào: D:\LapTrinhCocos2dx\ProjectsCocos\CreationGame\TempEclipse\Demo\proj.android và mở file project.properties nếu như hình bên dưới là ổn.

Tiếp theo ta sẽ khởi tạo thư viện của ta trong src bằng cách mở file AppActivity.java trong “Demo\proj.android\src\org\cocos2dx\cpp” và code như sau:

  1. private static AppActivity _appActivity;
  2. private TTSpeech _textToSpeech;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. _textToSpeech = new TTSpeech(this);
  7. _appActivity = this;
  8. }
  9.  
  10. public static void SpeakString(final String string) {
  11. _appActivity.runOnUiThread(new Runnable() {
  12.  
  13. @Override
  14. public void run() {
  15. System.out.println(" 3333333333333333333333333 ");
  16. _appActivity._textToSpeech.SpeakString(string);
  17. }
  18. });
  19. }

Đoạn code trong hàm onCreate có tác dụng khởi khởi tạo biến _textToSpeech từ thư viện, và hàm SpeakString dùng để đọc đoạn văn bản truyền vào.

Và cuối cùng trong thư mục “Demo\Classes” trong project cocos chúng ta sẽ tạo 2 fileNativeInterface.hNativeInterface.cpp như sau. 

Nội dung file NativeInterface.h

  1. #ifndef __NATIVEINTERFACE_H__
  2. #define __NATIVEINTERFACE_H__
  3. #include "cocos2d.h"
  4. #include
  5.  
  6. #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
  7. #include
  8. extern "C"
  9. {
  10. #endif
  11. extern void Jni_callSpeakString(const char *javaString);
  12. #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
  13. }
  14. #endif
  15. #endif /* defined(__NATIVEINTERFACE_H__) */

Nội dung file  NativeInterface.cpp sẽ như sau:

  1. #include "NativeInterface.h"
  2. #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
  3. using namespace cocos2d;
  4. #include <android/log.h>
  5. #include "platform/android/jni/JniHelper.h"
  6. #include
  7. #define LOG_TAG "NativeInterface"
  8. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
  9. #define CLASS_NAME "org/cocos2dx/cpp/AppActivity"
  10. #define SpeakFunc "SpeakString"
  11. void Jni_callSpeakString(const char *javaString) {
  12. CCLog("-----------Jni_callSpeakString ");
  13. cocos2d::JniMethodInfo methodInfo;
  14. if (!cocos2d::JniHelper::getStaticMethodInfo(methodInfo, CLASS_NAME, SpeakFunc, "(Ljava/lang/String;)V"))
  15. {
  16. CCLog(" 111111111111111111111111111 ");
  17. return;
  18. }
  19. jstring stringArg = methodInfo.env->NewStringUTF(javaString);
  20. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);
  21. methodInfo.env->DeleteLocalRef(stringArg);
  22. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  23. }
  24.  
  25. #else
  26.  
  27. #endif

Đến đây mọi việc đã xong, cuối cùng thì ta chỉ việc gọi hàm  Jni_callSpeakString(char). Mở fileHelloWorldScene.cpp (file này tạo project sẽ tự có) cùng thư mục. Và #include "NativeInterface.h" vào. Sau đó tim đến hàm void HelloWorld::menuCloseCallback(Ref* pSender) và comment  Director::getInstance()->end(); lại sau đó ta thêm vào dòng  Jni_callSpeakString("welcome to Stdio.vn") thì khi bấm vào nút exit sẽ phat ra âm thanh welcome to Stdio.vn bằng tiếng anh.

Các bạn nên nhớ add file NativeInterface vào file android.mk ở thư mục \Demo\proj.android\jni. Chúc các bạn thành công và có thể ứng dụng vào project của mình hiệu quả.

Lời kết

Trong bài viết này tôi hướng dẫn về cách tạo và gắn 1 thư viên tự tạo ra trong android mà hiện tại tính năng này chưa được Cocos2d-x hỗ trợ như là TTS nói riêng cũng như như cách để include 1 thư viện khác vào project Cocos2d-x nói chung. Hi vọng bài viết này có ích cho những bạn mới tìm hiểu. Xin cảm ơn Stdio cùng các bạn.

Download demo và source codes

Download APK: TTS_STDIO_ANDROID.zip (lưu ý: tôi đã nhúng sẵn text vào mã nguồn, sau khi cài đặt xong, bạn nhấn nút như hình dưới sẽ nghe được phát âm của TTS).

Download mã nguồn: src.zip

Theo: Stdio


Đăng sự kiện cho developer