Внедрение русской локали в плагин распознавания текста и речи для Android - PullRequest
1 голос
/ 28 сентября 2019

Ребята, я внедрил в свой проект Unity плагин, который можно скачать по ссылке (https://github.com/HoseinPorazar/Android-Native-TTS-plugin-for-Unity-3d).

. Чтобы использовать его, вам необходимо: 1-импортировать AndroidNativeTTS.unitypackage в ваш проект 2-создатьочистите игровой объект и переименуйте его в tts. 3-присоедините тестовый скрипт и TextToSpeech скрипт к tts игровому объекту. 4-добавьте кнопку и установите событие on click для test.Speak (). 5-build проект для платформы Android.

После реализации плагина для его работы необходимо удалить в AndroidManifext.xml строку «android: label = NAtive TTS».

AndroidManifest.xml хранится в каталоге «Assets \ Plugin \»Android \ androidtts-release.aar "

Когда я реализовал плагин, созданный для использования" Великобритании "и" США ", я попытался добавить русский язык, но, к сожалению, это не удалось.

Пожалуйста, смотрите сценарии ниже (Test.cs и TextToSpeach.cs):

test.cs

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

public class test : MonoBehaviour {

TextToSpeech tts;
void Start()
{

    tts = GetComponent<TextToSpeech>();
}
public void Speak()
{
    tts.Speak("hello mr hosein porazar kasin", (string msg) =>
    {
        tts.ShowToast(msg);
    });
}
public void ChangeSpeed()
{
    tts.SetSpeed(0.5f);
}
public void ChangeLanguage()
{
    tts.SetLanguage(TextToSpeech.Locale.UK);
}
public void ChangePitch()
{
    tts.SetPitch(0.6f);
}
}

TextToSpeech.cs

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


public class TextToSpeech :MonoBehaviour
{
void Start()
{


}
public enum Locale
{
    UK = 0,
    US = 1

}
private AndroidJavaObject TTSExample = null;
private AndroidJavaObject activityContext = null;
private Locale _lang;
public Locale Language { get { return _lang; } set { SetLanguage(value); } }
private float _pitch, _speed;
public float Pitch { get{return _pitch;} set { SetPitch(value); } }
public float Speed { get{return _speed;} set { SetSpeed(value); } }

public delegate void OnErrorCallbackHandler(string error);
private OnErrorCallbackHandler _callback;
public TextToSpeech()
{
    //Initialize();
}
public TextToSpeech(Locale language)
{
    Initialize();
    this.Language = language;
    SetLanguage(this.Language);
}
public TextToSpeech(Locale language,float speed,float pitch)
{
    Initialize();
    this.Language = language;
    this.Pitch = pitch;
    this.Speed = speed;
    SetLanguage(this.Language);
    SetSpeed(this.Speed);
    SetPitch(this.Pitch);
}
public void Speak(string toSay,OnErrorCallbackHandler callback)
{
    if (TTSExample == null)
    {
        Initialize();
    }
    this._callback = callback;


    TTSExample.Call("TTSMEWithCallBack", toSay, gameObject.name, "OnError");

}
    public void OnError(string error)
{
    if (_callback != null)
    {
        if (error.Length > 0)
        {
            _callback.Invoke(error);
        }
    }
    ShowToast(error);
}
public void Speak(string toSay)
{
    if (TTSExample == null)
    {
        Initialize();
    }

    TTSExample.Call("TTSME", toSay);

}
public void SetLanguage(Locale lan)
{
    this._lang = lan;
    string[] Language = new string[] {"UK","US" };
    if (TTSExample == null)
    {
        Initialize();
    }
    TTSExample.Call("SetLang", Language[(int)lan]);
}
public void SetSpeed(float speed)
{
    this._speed = speed;
    if (TTSExample == null)
    {
        Initialize();
    }
    TTSExample.Set<float>("Speed", speed);
}
public void SetPitch(float pitch)
{
    this._pitch = pitch;
    if (TTSExample == null)
    {
        Initialize();
    }
    TTSExample.Set<float>("Pitch", pitch);
}
private void Initialize()
{
    if (TTSExample == null)
    {
        using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
        }

        using (AndroidJavaClass pluginClass = new AndroidJavaClass("ir.hoseinporazar.androidtts.TTS"))
        {
            if (pluginClass != null)
            {
                TTSExample = pluginClass.CallStatic<AndroidJavaObject>("instance");
                TTSExample.Call("setContext", activityContext);              

            }
        }
    }


}
public void ShowToast(string msg)
{

    if (TTSExample == null)
    {
        using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
        }

        using (AndroidJavaClass pluginClass = new AndroidJavaClass("ir.hoseinporazar.androidtts.TTS"))
        {
            if (pluginClass != null)
            {
                TTSExample = pluginClass.CallStatic<AndroidJavaObject>("instance");
                TTSExample.Call("setContext", activityContext);
                activityContext.Call("runOnUiThread", new AndroidJavaRunnable(() =>
                {
                    TTSExample.Call("showMessage", msg);
                }));
            }
        }
    }
    else
    {
        activityContext.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            TTSExample.Call("showMessage", msg);
        }));
    }
}

}

Я пытался отформатировать следующие строки визмените язык на русский, но это мне не помогло:

public enum Locale
{
    RU = 0,
    US = 1

}

public void SetLanguage(Locale lan)
{
    this._lang = lan;
    string[] Language = new string[] {"RU","US" };
    if (TTSExample == null)
    {
        Initialize();
    }
    TTSExample.Call("SetLang", Language[(int)lan]);
}

Я также пытался связаться с разработчиком плагина, но, похоже, он был в последний раз на github пару лет назад.Буду очень признателен, если кто-нибудь сможет мне помочь с этой проблемой.

1 Ответ

0 голосов
/ 29 сентября 2019

На домашней странице плагина автор говорит ...

Я включил 2 языка (Великобритания и США), если вы хотите использовать другие языки, вам придется изменить плагин (с Android)Studio).

Так что, похоже, вам также потребуется изменить инструкцию switch в нижней части Java-кода:

https://github.com/HoseinPorazar/Android-Native-TTS-plugin-for-Unity-3d/blob/master/NativeAndroidTTS/androidtts/src/main/java/ir/hoseinporazar/androidtts/TTS.java

Добавив"RU" случай, подобный этому ...

public void SetLang(String loc){
    switch (loc){
        case "UK":
            if(t1!=null)
            t1.setLanguage(Locale.UK);
            break;
        case "US":
            if(t1!=null)
            t1.setLanguage(Locale.US);
            break;
        case "RU":
            if(t1!=null)
            t1.setLanguage(Locale.RU);
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...