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


  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4025110.html
Copyright © 2011-2022 走看看