Unity调用Android语音合成

unity直接调用android方法,调用TextToSpeechBeta需要引入com.goole.tts包。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IBAndroidTTS
{
    public delegate void DebugLog(string str);
    public static event DebugLog DebugHandle;

#if UNITY_ANDROID
    public class TextToSpeechInitListener : AndroidJavaProxy
    {
        public delegate void TTSInitDelegate(int status);

        private TTSInitDelegate m_TTSInitDelegate;

        public TextToSpeechInitListener() : base("android.speech.tts.TextToSpeech$OnInitListener")
        {

        }

        private void onInit(int status)
        {
            if (m_TTSInitDelegate != null)
            {
                m_TTSInitDelegate(status);
            }
            else
            {
                Debug.LogError("Init failed. Please call 'SetInitDelegate(TTSInitDelegate mTTSInitDelegate)' first");
            }
        }

        public void SetInitDelegate(TTSInitDelegate TTSInitDelegate)
        {
            m_TTSInitDelegate = TTSInitDelegate;
        }
    }

    public class TextToSpeechUtteranceCompletedListener : AndroidJavaProxy
    {
        public delegate void TTSUtteranceCompletedDelegate(string utteranceId);

        private TTSUtteranceCompletedDelegate m_TTSUtteranceCompletedDelegate;
        
        public TextToSpeechUtteranceCompletedListener() : base("android.speech.tts.TextToSpeech$OnUtteranceCompletedListener")
        {

        }

        void onUtteranceCompleted(string utteranceId)
        {
            if (m_TTSUtteranceCompletedDelegate != null)
            {
                m_TTSUtteranceCompletedDelegate(utteranceId);
            }
            else
            {
                if (DebugHandle != null)
                {
                    DebugHandle("Init failed. Please call 'SetInitDelegate(TTSUtteranceCompletedDelegate m_TTSUtteranceCompletedDelegate)' first");
                }
            }
        }

        public void SetUtteranceCompletedDelegate(TTSUtteranceCompletedDelegate TTSUtteranceCompletedDelegate)
        {
            m_TTSUtteranceCompletedDelegate = TTSUtteranceCompletedDelegate;
        }
    }

    #region singleton
    private static object m_locker = new object();
    protected static IBAndroidTTS m_instance;
    public static IBAndroidTTS Instance
    {
        get
        {
            if (m_instance == null)
            {
                lock (m_locker)
                {
                    if (m_instance == null)
                    {
                        m_instance = new IBAndroidTTS();
                        m_instance.Init();
                    }
                }
            }
            return m_instance;
        }
    }
    #endregion

    #region  TextToSpeech STATE
    const int TextToSpeech_SUCCESS = 0;
    const int TextToSpeech_LANG_MISSING_DATA = -1;
    const int TextToSpeech_LANG_NOT_SUPPORTED = -2;
    const int TextToSpeech_QUEUE_FLUSH = 0;
    #endregion

    #region Android TextToSpeech
    //AndroidJavaClass
    private AndroidJavaClass Locale;
    private AndroidJavaClass UnityPlayer;
    //AndroidJavaObject
    private AndroidJavaObject m_currentActivity;
    private AndroidJavaObject m_androidTTS;
    private TextToSpeechInitListener m_initListener;
    private TextToSpeechUtteranceCompletedListener m_utteranceCompletedListener;

    private void Init()
    {
        Locale = new AndroidJavaClass("java.util.Locale");
        m_initListener = new TextToSpeechInitListener();
        m_initListener.SetInitDelegate(OnInitTTSEngine);
        UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        m_currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        m_androidTTS = new AndroidJavaObject("android.speech.tts.TextToSpeech", m_currentActivity, m_initListener);

        m_utteranceCompletedListener = new TextToSpeechUtteranceCompletedListener();
        m_utteranceCompletedListener.SetUtteranceCompletedDelegate(OnUtteranceCompleted);
        int result = m_androidTTS.Call<int>("setOnUtteranceCompletedListener", m_utteranceCompletedListener);
        if (DebugHandle != null)
        {
            DebugHandle("setComplete" + result);
        }
    }
    #endregion

    private bool m_isChinese = false;
    public bool IsChinese
    {
        get
        {
            return m_isChinese;
        }
    }

    private void OnInitTTSEngine(int status)
    {
        if (status == TextToSpeech_SUCCESS)
        {
            int result = m_androidTTS.Call<int>("setLanguage", Locale.GetStatic<AndroidJavaObject>("CHINESE"));

            if (result != TextToSpeech_SUCCESS)
            {
                string error = "Chinese not supported, English Mode Start Instead";
                if (DebugHandle != null)
                {
                    DebugHandle(error);
                }
                //error.ShowToast();

                m_androidTTS.Call<int>("setLanguage", Locale.GetStatic<AndroidJavaObject>("US"));
            }
            else
            {
                m_isChinese = true;
            }
        }
    }

    private void OnUtteranceCompleted(string utteranceId)
    {
        if (DebugHandle != null)
        {
            DebugHandle(utteranceId);
        }
    }

    public void Speak(string str)
    {
        if (IsDone() == true)
        {
            m_androidTTS.Call<int>("speak",  new AndroidJavaObject("java.lang.String", CSharpString), TextToSpeech_QUEUE_FLUSH, null, str);
        }
    }

    public bool IsDone()
    {
        return !IsSpeaking();
    }

    public void Stop()
    {
        m_androidTTS.Call<int>("stop");
    }

    public void SetVolume(int volume)
    {
        //m_androidTTS.Call<int>("", volume);
    }

    public void SetRate(float rate)
    {
        m_androidTTS.Call<int>("setSpeechRate", rate);

    }

    public void SetPitch(float pitch)
    {
        m_androidTTS.Call<int>("setPitch", pitch);

    }

    public bool IsSpeaking()
    {
        return m_androidTTS.Call<bool>("isSpeaking");
    }

    #region TTSBeta
    /**
     * public class TextToSpeechBetaInitListener : AndroidJavaProxy
    {
        public TextToSpeechBetaInitListener() : base("com.google.tts.TextToSpeechBeta$OnInitListener")
        {

        }

        public delegate void TTSBetaInitDelegate(int status, int versionCode);

        private TTSBetaInitDelegate m_TTSBetaInitDelegate;

        private void OnInit(int status, int versionCode)
        {
            if (m_TTSBetaInitDelegate != null)
            {
                m_TTSBetaInitDelegate(status, versionCode);
            }
            else
            {
                Debug.LogError("Init failed. Please call 'SetInitDelegate(TextToSpeechBetaInitListener m_TTSBetaInitDelegate)' first");
            }
        }

        public void SetInitDelegate(TTSBetaInitDelegate TTSBetaInitDelegate)
        {
            m_TTSBetaInitDelegate = TTSBetaInitDelegate;
        }
    }

    private AndroidJavaObject m_androidTTSBeta;
    private TextToSpeechBetaInitListener m_betainitListener;

    private void InitAndroidTextToSpeechBeta()
    {
       ///需要引入com.google.tts jave包
       m_betainitListener = new TextToSpeechBetaInitListener();
       m_betainitListener.SetInitDelegate(OnInitTTSBetaEngine);
       UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
       m_currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
       m_androidTTSBeta = new AndroidJavaObject ("com.google.tts.TextToSpeechBeta", m_currentActivity, m_betainitListener);
       
    }

    private void OnInitTTSBetaEngine(int status, int versionCode)
    {
        if (status == TextToSpeech_SUCCESS)
        {

            int result = m_androidTTSBeta.Call<int>("setLanguage", Locale.GetStatic<AndroidJavaObject>("CHINA"));

            if (result != TextToSpeech_SUCCESS)
            {
                string error = "Chinese not supported, English Mode Start Instead";
                error.ShowToast();

                m_androidTTSBeta.Call<int>("setLanguage", Locale.GetStatic<AndroidJavaObject>("US"));
            }
        }
    }
    **/
    #endregion
#endif
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity调用Android相册可以通过编写本地插件来实现。以下是一种方法: 首先,创建一个Java类作为我们的本地插件。在Android Studio中,创建一个新的Java类文件,并添加以下代码: ```java import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; public class GalleryPlugin { public static void OpenGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/jpeg", "image/png"}); UnityPlayer.currentActivity.startActivityForResult(intent, 1); } } ``` 然后,在Unity中创建一个C#脚本来调用这个本地插件。在脚本中,我们将使用`DllImport`来导入Android库,并定义一个静态方法来调用Java类中的方法: ```csharp using System.Runtime.InteropServices; public class AndroidGallery : MonoBehaviour { [DllImport("gallery_plugin")] private static extern void OpenGallery(); public void OpenAndroidGallery() { OpenGallery(); } } ``` 在Unity中创建一个UI按钮,并将其连接到`OpenAndroidGallery`方法。这样,当我们点击按钮时,将调用本地插件的方法。 最后,将生成的Java类文件和C#脚本文件分别放在对应的目录中,并导出到Android项目中。 通过这种方式,我们可以在Unity调用Android相册,并允许用户选择图片。一旦用户选择了图片,可以使用Unity的处理方法进行后续操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值