其实很简单,不过有些细节需要注意。

关于讯飞语音在android上的应用,大家需要自己去下载SDK,然后按照讯飞语音提供的api在自己的android的Demo上运行成功,那东西也相当的简单。

然后,大家也需要把自己的cocos2dx项目在android 上部署起来,这些网上资料很多,也不一一解释,后续我也会做出对应的总结。这里不多说。

OK,废话不多说,直接上代码

思路就是,通过cocos2dx的JNIhelper类实现C++对Java的调用,然后实现语音功能

废话不多说:

直接上代码:这里我在项目中直接把对语音的调用用了一个voice类

8f99d456d867dd6e2eb9527f135f0867.png

Voice.h

#ifndef _VOICE_H__

#define _VOICE_H__

#include "cocos2d.h"

USING_NS_CC;

/**

* 添加声音

*/

void onVoice(const char * data);

#endif

Voice.cpp

#include "Voice.h"

#include "cocos2d.h"

#include "IconvString.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "jni.h"

#include "platform/android/jni/JniHelper.h"

#endif

USING_NS_CC;

void onVoice(const char *data){

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo jmi;

//java的类名

const char * jniClass = "org/cocos2dx/cpp/AppActivity";

//获取java部分的方法,详细参数请参考JniMethodInfo类的源码,参数分别为,类对象,java类,java类的方法,方法的参数和返回值,V表示void类型返回值(即无返回值,括号里面的表示参数,参数是一个字符串【详见JNI签名规范】)

bool isHave = JniHelper::getStaticMethodInfo(jmi,jniClass,"onVoiceStart","(Ljava/lang/String;)V");

if (isHave){

//转换字符串以及格式

jstring jdata = jmi.env->NewStringUTF(GBKToUTF8(data));

//调用java的方法,前面2个参数是固定的,后面的参数是在java的方法中的参数

jmi.env->CallStaticVoidMethod(jmi.classID, jmi.methodID, jdata);

}

#endif

}

Java 端的代码如下(附带百度广告的实现代码)

package org.cocos2dx.cpp;

import org.cocos2dx.lib.Cocos2dxActivity;

import android.app.ActionBar.LayoutParams;

import android.os.Bundle;

import android.util.Log;

import android.widget.RelativeLayout;

import com.baidu.mobads.AdView;

import com.iflytek.cloud.SpeechConstant;

import com.iflytek.cloud.SpeechError;

import com.iflytek.cloud.SpeechSynthesizer;

import com.iflytek.cloud.SpeechUtility;

import com.iflytek.cloud.SynthesizerListener;

public class AppActivity extends Cocos2dxActivity {

// 语音+安装助手类

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

SpeechUtility.createUtility(AppActivity.this, "appid=53bb48d3");

showAds();

}

/**

* C++ 调用方法,实现语音播报

* @param value 要播报的内容

* @param person 声音的角色,建议用小女孩 vinn

* @param voiceSpeed 声音的语速,建议45

* @param voicePitch 音调 ,建议 55

* @param voiceVolume 音量 建议 100

*/

//String value,String person,String voiceSpeed,String voicePitch,String voiceVolume

public static void onVoiceStart(final String value)throws Exception{

SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(AppActivity.getContext(), null);

mTts.setParameter(SpeechConstant.VOICE_NAME,"vinn");

//设置语速

mTts.setParameter(SpeechConstant.SPEED,"45");

//设置音调

mTts.setParameter(SpeechConstant.PITCH,"55");

//设置音量

mTts.setParameter(SpeechConstant.VOLUME,"100");

//设置播放器音频流类型

mTts.setParameter(SpeechConstant.STREAM_TYPE, "2");

mTts.startSpeaking(value, mTtsListener);

}

private static SynthesizerListener mTtsListener = new SynthesizerListener() {

@Override

public void onSpeakBegin() {

}

@Override

public void onSpeakPaused() {

}

@Override

public void onSpeakResumed() {

}

@Override

public void onBufferProgress(int percent, int beginPos, int endPos,

String info) {

}

@Override

public void onSpeakProgress(int percent, int beginPos, int endPos) {

}

@Override

public void onCompleted(SpeechError error) {

}

};

//显示广告

private void showAds(){

//相对定位布局

RelativeLayout layout = new RelativeLayout(this);

//给广告区域的宽高属性定义

addContentView(layout,new LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT));

//把广告层添加到当前界面上

AdView adView = new AdView(this);

//大小

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);

//位置

layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

//添加进项目中进行显示

layout.addView(adView,layoutParams );

}

}

调用语言的代码:

onVoice(“你是我的小苹果”);

在外部使用别忘了引入头文件哦

#include "Voice/Voice.h"

这样就可以实现了,百度广告部分,大家有兴趣去研究下,也是需要sdk的哦

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐