Search…

Ứng Dụng Text To Speech Vào Project Cocos2d-x

27/09/20204 min read
Hướng dẫn 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.

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.

ss_1

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

ss_2

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:

ss_3

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.

ss_4
ss_5

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.

ss_6

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:

ss_7

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.

ss_8

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...

ss_9

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.

ss_10

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);           
		}
	});
}
ss_11

Đ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.hNativeInterface.cpp như sau. 

ss_12

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.

ss_13

Download mã nguồn: src.zip

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024