zoukankan      html  css  js  c++  java
  • cocos2dx实现android的对讯飞语音的合成(语言朗读的实现)

    事实上非常easy,只是有些细节须要注意。


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


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


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


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


    废话不多说:

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



    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的哦


  • 相关阅读:
    分布式数据库中间件Mycat百亿级数据存储(转)
    大文本字符串滤重的解决方案(转)
    java处理大文本2G以上
    Mysql binlog详解
    varnish squid nginx比较
    java运行时内存分类
    redis rdb aof比较
    LeetCode 94 ——二叉树的中序遍历
    线性代数之——向量空间
    线性代数之——A 的 LU 分解
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4025110.html
Copyright © 2011-2022 走看看