Bài viết 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.
Hiện thực
Tạo project với Cocos2d-x
Tạo project mới trong Cocos2d-x với dòng lệnh.
Import project vào Eclipse
Project Cocos2d-x đã tạo xong, mở eclipse lên và chọn File → Import sau đó chọn như hình bên dưới và chọn Next.
Sau đó, 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, 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ụ: D:\LapTrinhCocos2dx\cocos2d-x-3.5
Sau khi import xong:
Thêm TTS vào project
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.
Click chọn vào Mark this project as a library và click Next → Next → Finish.
Kiểm tra việc cài đặt
Sau khi tạo xong 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 tìm file vào TTSpeech.java trong thư mục src để viết code cho thư viện.
package com.TTSUS; import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.content.Context; public class TTSpeech extends Activity implements OnInitListener{ private TextToSpeech texttospeech = null; public TTSpeech(Context context) { super(); if(texttospeech == null) texttospeech = new TextToSpeech(context, this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onInit(int status) { // TODO Auto-generated method stub } public void SpeakString(String string) { if(!texttospeech.isSpeaking()); { texttospeech.speak(string, TextToSpeech.QUEUE_FLUSH, null); texttospeech.setLanguage(Locale.US); texttospeech.setPitch((float) 1.2); texttospeech.setSpeechRate(1); } } }
Hình ảnh của bước trên:
Sau khi khởi tạo project xong, phân tích code bên trên:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onInit(int status) { // TODO Auto-generated method stub }
Ở hàm onCreate
và hàm onInit
nên xóa hết không cần viết gì ở đây vì đây là bài demo cho TTS.
private TextToSpeech texttospeech = null; public TTSpeech(Context context) { super(); if(texttospeech == null) texttospeech = new TextToSpeech(context, this); }
Đ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
.
public void SpeakString(String string) { if(!texttospeech.isSpeaking()); { texttospeech.speak(string, TextToSpeech.QUEUE_FLUSH, null); texttospeech.setLanguage(Locale.US); texttospeech.setPitch((float) 1.2); texttospeech.setSpeechRate(1); } }
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ó thể tham khảo thêm ở ngoài về các tham số:
.speak
.setLanguage
.setPitch
.setSpeechRate
Đến đây là đã tạo xong thư viện TTS rồi. Giờ sẽ ứng dụng thư viện vào trong project Cocos2d-x.
Trong cửa sổ Eclipse chọn vào project cocos lúc nãy import vào và chọn Properties.
Chưa thấy gì trong thư viện, 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, chọn libcocos2dx và nhấn ok.
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.
Khởi tạo thư viện trong src bằng cách mở file AppActivity.java trong “Demo\proj.android\src\org\cocos2dx\cpp” và code như sau:
private static AppActivity _appActivity; private TTSpeech _textToSpeech; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _textToSpeech = new TTSpeech(this); _appActivity = this; } public static void SpeakString(final String string) { _appActivity.runOnUiThread(new Runnable() { @Override public void run() { System.out.println(" 3333333333333333333333333 "); _appActivity._textToSpeech.SpeakString(string); } }); }
Đ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 sẽ tạo 2 file NativeInterface.h và NativeInterface.cpp như sau.
Nội dung file NativeInterface.h
#ifndef __NATIVEINTERFACE_H__ #define __NATIVEINTERFACE_H__ #include "cocos2d.h" #include <iostream> #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #include <jni.h> extern "C" { #endif extern void Jni_callSpeakString(const char *javaString); #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID } #endif #endif /* defined(__NATIVEINTERFACE_H__) */
Nội dung file NativeInterface.cpp sẽ như sau:
#include "NativeInterface.h" #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID using namespace cocos2d; #include <android/log.h> #include "platform/android/jni/JniHelper.h" #include <jni.h> #define LOG_TAG "NativeInterface" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) #define CLASS_NAME "org/cocos2dx/cpp/AppActivity" #define SpeakFunc "SpeakString" void Jni_callSpeakString(const char *javaString) { CCLog("-----------Jni_callSpeakString "); cocos2d::JniMethodInfo methodInfo; if (!cocos2d::JniHelper::getStaticMethodInfo(methodInfo, CLASS_NAME, SpeakFunc, "(Ljava/lang/String;)V")) { CCLog(" 111111111111111111111111111 "); return; } jstring stringArg = methodInfo.env->NewStringUTF(javaString); methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg); methodInfo.env->DeleteLocalRef(stringArg); methodInfo.env->DeleteLocalRef(methodInfo.classID); } #else #endif
Đến đây mọi việc đã xong, gọi hàm Jni_callSpeakString(char)
.
Mở file HelloWorldScene.cpp cùng thư mục. Và #include "NativeInterface.h"
vào.
SSau đó tìm đến hàm void HelloWorld::menuCloseCallback(Ref* pSender)
và comment Director::getInstance()->end();
lại.
Thêm vào dòng Jni_callSpeakString("welcome to Stdio.vn")
thì khi bấm vào nút exit sẽ phát ra âm thanh welcome to Stdio.vn
bằng tiếng anh.
Add file NativeInterface vào file android.mk ở thư mục \Demo\proj.android\jni.
Download demo và source codes
Download APK: TTS_STDIO_ANDROID.zip.
Download mã nguồn: src.zip