• Android实例-调用GOOGLE的TTS实现文字转语音(XE7+小米2)(XE10.1+小米5)


    相关资料:

    注意:在手机上必须选安装文字转语音引擎“google Text To Speech”
    地址:http://www.shouji56.com/soft/GoogleWenZiZhuanYuYinYinQingGoogleTexttoSpeech_3864/

    结果总结:

    XE10.1 + 小米手机5 = 通过测试
    首先手机上必须安装语音包: 
    1.“google Text To Speech” (不知为什么我的只发英文) 
    2.“度秘语音引擎3.0” (中英都可以发音) 
    3.“科大讯飞语音引擎3.0”(中英都可以发音) 
    4.APK发音使用的是当前语音包 
    5.小米手机5-设置-更多设置-语言和输入法-文字转语音(TTS)输出 


    1. 新建一个单元Androidapi.JNI.TTS
     

      1 {*******************************************************}
      2 {                                                       }
      3 {           CodeGear Delphi Runtime Library             }
      4 { Copyright(c) 2013 Jeff Overcash                       }
      5 {                                                       }
      6 {*******************************************************}
      7 
      8 { Delphi trnslation for TTS Android Java classes from                            }
      9 { http://developer.android.com/reference/android/speech/tts/package-summary.html }
     10 
     11 unit Androidapi.JNI.TTS;
     12 
     13 interface
     14 
     15 uses Androidapi.JNIBridge,
     16   Androidapi.JNI.JavaTypes,
     17   Androidapi.JNI.Os,
     18   Androidapi.JNI.App,
     19   Androidapi.JNI.GraphicsContentViewText;
     20 
     21 type
     22 
     23   {Forward declarations}
     24   JSynthesisCallback = interface; // android.speech.tts.SynthesisCallback
     25   JSynthesisRequest = interface; // android.speech.tts.SynthesisRequest
     26   JTextToSpeech = interface; // android.speech.tts.TextToSpeech
     27   JTextToSpeech_Engine = interface; // android.speech.tts.TextToSpeech$Engine
     28   JTextToSpeech_EngineInfo = interface; //android.speech.tts.TextToSpeech$EngineInfo
     29   JTextToSpeech_OnInitListener = interface; // android.speech.tts.TextToSpeech$OnInitListener
     30   JTextToSpeech_OnUtteranceCompletedListener = interface; // android.speech.tts.TextToSpeech$OnUtteranceCompletedListener
     31   JTextToSpeechService = interface; // android.speech.tts.TextToSpeechService
     32   JUtteranceProgressListener = interface; // android.speech.tts.UtteranceProgressListener
     33 
     34   JSynthesisCallbackClass = interface(IJavaClass)
     35     ['{3B30766E-A43B-4005-BE92-472CD075F325}']
     36   end;
     37 
     38   [JavaSignature('android/speech/tts/SynthesisCallback')]
     39   JSynthesisCallback = interface(IJavaInstance)
     40     ['{190C13DE-BC7E-44CE-94F6-4AF1A84A4612}']
     41     function audioAvailable(buffer: TJavaArray<byte>; offset: Integer; length: Integer): Integer; cdecl;
     42     function done: Integer; cdecl;
     43     procedure error; cdecl;
     44     function getMaxBufferSize: Integer; cdecl;
     45     function start(sampleRateInHz: Integer; audioFormat: Integer;  channelCount: Integer): Integer; cdecl;
     46   end;
     47   TJSynthesisCallback = class(TJavaGenericImport<JSynthesisCallbackClass, JSynthesisCallback>) end;
     48 
     49   JSynthesisRequestClass = interface(JObjectClass)
     50     ['{AE41459D-42C6-4E66-B174-F6FA5216A1DA}']
     51     { Method }
     52     function init(text: JString; params: JBundle): JSynthesisRequest;
     53   end;
     54 
     55   [JavaSignature('android/speech/tts/SynthesisRequest')]
     56   JSynthesisRequest = interface(JObject)
     57     ['{1963DAD8-C58F-4868-BF8A-B43AE7A14145}']
     58     function getCountry: JString; cdecl;
     59     function getLanguage: JString; cdecl;
     60     function getParams: JBundle; cdecl;
     61     function getPitch: Integer; cdecl;
     62     function getSpeechRate: Integer; cdecl;
     63     function getText: JString; cdecl;
     64     function getVariant: JString; cdecl;
     65   end;
     66   TJSynthesisRequest = class(TJavaGenericImport<JSynthesisRequestClass, JSynthesisRequest>) end;
     67 
     68   JTextToSpeechClass = interface(JObjectClass)
     69     ['{0E2C5E49-95BE-4F19-BCCD-21960D03E957}']
     70     { Property Methods }
     71     function _GetACTION_TTS_QUEUE_PROCESSING_COMPLETED: JString;
     72     function _GetERROR: Integer;
     73     function _GetLANG_AVAILABLE: Integer;
     74     function _GetLANG_COUNTRY_AVAILABLE: Integer;
     75     function _GetLANG_COUNTRY_VAR_AVAILABLE: Integer;
     76     function _GetLANG_MISSING_DATA: Integer;
     77     function _GetLANG_NOT_SUPPORTED: Integer;
     78     function _GetQUEUE_ADD: Integer;
     79     function _GetQUEUE_FLUSH: Integer;
     80     function _GetSUCCESS: Integer;
     81     { Methods }
     82     function init(contect: JContext; listener: JTextToSpeech_OnInitListener) : JTextToSpeech; cdecl; overload;
     83     function init(context: JContext; listener: JTextToSpeech_OnInitListener; engine: JString): JTextToSpeech; overload;
     84     { Properties }
     85     property ACTION_TTS_QUEUE_PROCESSING_COMPLETED: JString read _GetACTION_TTS_QUEUE_PROCESSING_COMPLETED;
     86     property ERROR: Integer read _GetERROR;
     87     property LANG_AVAILABLE: Integer read _GetLANG_AVAILABLE;
     88     property LANG_COUNTRY_AVAILABLE: Integer read _GetLANG_COUNTRY_AVAILABLE;
     89     property LANG_COUNTRY_VAR_AVAILABLE: Integer read _GetLANG_COUNTRY_VAR_AVAILABLE;
     90     property LANG_MISSING_DATA: Integer read _GetLANG_MISSING_DATA;
     91     property LANG_NOT_SUPPORTED: Integer read _GetLANG_NOT_SUPPORTED;
     92     property QUEUE_ADD: Integer read _GetQUEUE_ADD;
     93     property QUEUE_FLUSH: Integer read _GetQUEUE_FLUSH;
     94     property SUCCESS: Integer read _GetSUCCESS;
     95   end;
     96 
     97   [JavaSignature('android/speech/tts/TextToSpeech')]
     98   JTextToSpeech = interface(JObject)
     99     ['{E1D06364-F967-4381-B178-EEDD42C203C7}']
    100     function addEarcon(earcon: JString; filename: JString): Integer; cdecl; overload;
    101     function addEarcon(earcon: JString; packagename: JString; resourceID: Integer): Integer; cdecl; overload;
    102     function addSpeech(text: JString; filename: JString): Integer; cdecl; overload;
    103     function addSpeech(text: JString; packagename: JString; resourceID: Integer) : Integer; cdecl; overload;
    104     function areDefaultsEnforced: Boolean; cdecl;
    105     function getDefaultEngine: JString; cdecl;
    106     function getEngines: JList; cdecl;
    107     function getFeatures(locale: JLocale): JSet; cdecl;
    108     function getLanguage: JLocale; cdecl;
    109     function isLanguageAvailable(loc: JLocale): Integer; cdecl;
    110     function isSpeaking: Boolean; cdecl;
    111     function playEarcon(earcon: JString; queueMode: Integer; params: JHashMap) : Integer; cdecl;
    112     function playSilence(durationInMs: Int64; queueMode: Integer; params: JHashMap): Integer; cdecl;
    113     function setEngineByPackageName(enginePackageName: JString): Integer; cdecl;
    114     function setLanguage(loc: JLocale): Integer; cdecl;
    115     function setOnUtteranceCompletedListener(listener: JTextToSpeech_OnUtteranceCompletedListener): Integer; cdecl;
    116     function setOnUtteranceProgressListener(listener: JUtteranceProgressListener): Integer; cdecl;
    117     function setPitch(pitch: Single): Integer; cdecl;
    118     function setSpeechRate(speechRate: Single): Integer; cdecl;
    119     procedure shutdown; cdecl;
    120     function speak(text: JString; queueMode: Integer; params: JHashMap) : Integer; cdecl;
    121     function stop: Integer; cdecl;
    122     function synthesizeToFile(text: JString; params: JHashMap; filename: String) : Integer; cdecl;
    123   end;
    124   TJTextToSpeech = class(TJavaGenericImport<JTextToSpeechClass, JTextToSpeech>) end;
    125 
    126   JTextToSpeech_EngineClass = interface(JObjectClass)
    127     ['{8516EA75-A410-4EEE-8281-9ABCE1577F46}']
    128     { Property Methods }
    129     function _GeCHECK_VOICE_DATA_PASS: Integer;
    130     function _GetACTION_CHECK_TTS_DATA: JString;
    131     function _GetACTION_INSTALL_TTS_DATA: JString;
    132     function _GetACTION_TTS_DATA_INSTALLED: JString;
    133     function _GetCHECK_VOICE_DATA_BAD_DATA: Integer;
    134     function _GetCHECK_VOICE_DATA_FAIL: Integer;
    135     function _GetCHECK_VOICE_DATA_MISSING_DATA: Integer;
    136     function _GetCHECK_VOICE_DATA_MISSING_VOLUME: Integer;
    137     function _GetDEFAULT_STREAM: Integer;
    138     function _GetEXTRA_AVAILABLE_VOICES: JString;
    139     function _GetEXTRA_CHECK_VOICE_DATA_FOR: JString;
    140     function _GetEXTRA_TTS_DATA_INSTALLED: JString;
    141     function _GetEXTRA_UNAVAILABLE_VOICES: JString;
    142     function _GetEXTRA_VOICE_DATA_FILES: JString;
    143     function _GetEXTRA_VOICE_DATA_FILES_INFO: JString;
    144     function _GetEXTRA_VOICE_DATA_ROOT_DIRECTORY: JString;
    145     function _GetINTENT_ACTION_TTS_SERVICE: JString;
    146     function _GetKEY_FEATURE_EMBEDDED_SYNTHESIS: JString;
    147     function _GetKEY_FEATURE_NETWORK_SYNTHESIS: JString;
    148     function _GetKEY_PARAM_PAN: JString;
    149     function _GetKEY_PARAM_STREAM: JString;
    150     function _GetKEY_PARAM_UTTERANCE_ID: JString;
    151     function _GetKEY_PARAM_VOLUME: JString;
    152     function _GetSERVICE_META_DATA: JString;
    153     { Methods }
    154     function init: JTextToSpeech_Engine;
    155     { Properties }
    156     property ACTION_CHECK_TTS_DATA: JString read _GetACTION_CHECK_TTS_DATA;
    157     property ACTION_INSTALL_TTS_DATA: JString read _GetACTION_INSTALL_TTS_DATA;
    158     property ACTION_TTS_DATA_INSTALLED: JString read _GetACTION_TTS_DATA_INSTALLED;
    159     property CHECK_VOICE_DATA_BAD_DATA: Integer read _GetCHECK_VOICE_DATA_BAD_DATA;
    160     property CHECK_VOICE_DATA_FAIL: Integer read _GetCHECK_VOICE_DATA_FAIL;
    161     property CHECK_VOICE_DATA_MISSING_DATA: Integer read _GetCHECK_VOICE_DATA_MISSING_DATA;
    162     property CHECK_VOICE_DATA_MISSING_VOLUME: Integer read _GetCHECK_VOICE_DATA_MISSING_VOLUME;
    163     property CHECK_VOICE_DATA_PASS: Integer read _GeCHECK_VOICE_DATA_PASS;
    164     property DEFAULT_STREAM: Integer read _GetDEFAULT_STREAM;
    165     property EXTRA_AVAILABLE_VOICES: JString read _GetEXTRA_AVAILABLE_VOICES;
    166     property EXTRA_CHECK_VOICE_DATA_FOR: JString read _GetEXTRA_CHECK_VOICE_DATA_FOR;
    167     property EXTRA_TTS_DATA_INSTALLED: JString read _GetEXTRA_TTS_DATA_INSTALLED;
    168     property EXTRA_UNAVAILABLE_VOICES: JString read _GetEXTRA_UNAVAILABLE_VOICES;
    169     property EXTRA_VOICE_DATA_FILES: JString read _GetEXTRA_VOICE_DATA_FILES;
    170     property EXTRA_VOICE_DATA_FILES_INFO: JString read _GetEXTRA_VOICE_DATA_FILES_INFO;
    171     property EXTRA_VOICE_DATA_ROOT_DIRECTORY: JString read _GetEXTRA_VOICE_DATA_ROOT_DIRECTORY;
    172     property INTENT_ACTION_TTS_SERVICE: JString read _GetINTENT_ACTION_TTS_SERVICE;
    173     property KEY_FEATURE_EMBEDDED_SYNTHESIS: JString read _GetKEY_FEATURE_EMBEDDED_SYNTHESIS;
    174     property KEY_FEATURE_NETWORK_SYNTHESIS: JString read _GetKEY_FEATURE_NETWORK_SYNTHESIS;
    175     property KEY_PARAM_PAN: JString read _GetKEY_PARAM_PAN;
    176     property KEY_PARAM_STREAM: JString read _GetKEY_PARAM_STREAM;
    177     property KEY_PARAM_UTTERANCE_ID: JString read _GetKEY_PARAM_UTTERANCE_ID;
    178     property KEY_PARAM_VOLUME: JString read _GetKEY_PARAM_VOLUME;
    179     property SERVICE_META_DATA: JString read _GetSERVICE_META_DATA;
    180   end;
    181 
    182   JTextToSpeech_Engine = interface(JObject)
    183     ['{5BAC3048-CB0C-4DC4-AF62-D0D9AE4394CF}']
    184   end;
    185   TJTextToSpeech_Engine = class(TJavaGenericImport<JTextToSpeech_EngineClass, JTextToSpeech_Engine>) end;
    186 
    187 
    188   JTextToSpeech_EngineInfoClass = interface(JObjectClass)
    189   ['{8297AD59-5A6F-4867-A185-CA09BAD90159}']
    190   {Methods}
    191     function init : JTextToSpeech_EngineInfo;
    192   end;
    193 
    194   JTextToSpeech_EngineInfo = interface(JObject)
    195   ['{204B30D8-6E25-4531-847D-18588D48D9BF}']
    196   {property Methods}
    197     function _Geticon: integer;
    198     function _Getlabel: JString;
    199     function _Getname: JString;
    200     procedure _Seticon(const Value: integer);
    201     procedure _Setlabel(const Value: JString);
    202     procedure _Setname(const Value: JString);
    203   {Properties}
    204     property icon : integer read _Geticon write _Seticon;
    205     property _label : JString read _Getlabel write _Setlabel;
    206     property name : JString read _Getname write _Setname;
    207   end;
    208   TJTextToSpeech_EngineInfo = class(TJavaGenericImport<JTextToSpeech_EngineInfoClass, JTextToSpeech_EngineInfo>) end;
    209 
    210   JTextToSpeech_OnInitListenerClass = interface(IJavaClass)
    211     ['{58D32EFB-6528-4EC6-BA4F-28B22FE8E573}']
    212   end;
    213 
    214   [JavaSignature('android/speech/tts/TextToSpeech$OnInitListener')]
    215   JTextToSpeech_OnInitListener = interface(IJavaInstance)
    216     ['{027DA109-680A-4A69-905D-F62E2BD1282F}']
    217     procedure onInit(status: Integer); cdecl;
    218   end;
    219   TJTextToSpeech_OnInitListener = class(TJavaGenericImport<JTextToSpeech_OnInitListenerClass,JTextToSpeech_OnInitListener>) end;
    220 
    221   JTextToSpeech_OnUtteranceCompletedListenerClass = interface(IJavaClass)
    222     ['{0A608BB9-A6BF-4746-8419-9317AD625DFA}']
    223   end;
    224 
    225   [JavaSignature('android/speech/tts/TextToSpeech$OnUtteranceCompletedListener')]
    226   JTextToSpeech_OnUtteranceCompletedListener = interface(IJavaInstance)
    227     ['{00439F2B-E73C-4B93-A9E3-832AE3CC1D5F}']
    228     procedure onUtteranceCompleted(utteranceID: JString); cdecl;
    229   end;
    230   TJTextToSpeech_OnUtteranceCompletedListener = class(TJavaGenericImport<JTextToSpeech_OnUtteranceCompletedListenerClass, JTextToSpeech_OnUtteranceCompletedListener>) end;
    231 
    232   JTextToSpeechServiceClass = interface(JServiceClass)
    233   ['{6BCC6ADC-CBCB-4515-A5C3-E33F9787EEC2}']
    234     function init : JTextToSpeechService;
    235   end;
    236 
    237   [JavaSignature('android/speech/tts/TextToSpeechService')]
    238   JTextToSpeechService = interface(JService)
    239   ['{EE3943B6-88DC-488B-9E10-E0FA9914708D}']
    240     function onGetFeaturesForLanguage(lang : JString; country : JString; variant : JString) : JSet; cdecl;
    241     function onGetLanguage : TJavaArray<JString>; cdecl;
    242     function onIsLanguageAvailable(lang : JString; country : JString; variant : JString) : Integer; cdecl;
    243     function onLoadLanguage(lang : JString; country : JString; variant : JString) : Integer; cdecl;
    244     procedure onStop; cdecl;
    245     procedure onSynthesizeText(request : JSynthesisRequest; callback : JSynthesisCallback); cdecl;
    246   end;
    247   TJTextToSpeechService = class(TJavaGenericImport<JTextToSpeechServiceClass, JTextToSpeechService>) end;
    248 
    249   JUtteranceProgressListenerClass = interface(JObjectClass)
    250     ['{0870532F-6FD7-4B1F-9DEF-B53F0095C98A}']
    251     { Method }
    252     function init: JUtteranceProgressListener;
    253   end;
    254 
    255   [JavaSignature('android/speech/tts/UtteranceProgressListener')]
    256   JUtteranceProgressListener = interface(JObject)
    257     ['{8B03499D-0B26-4F36-90E8-F724BD78DB0C}']
    258     procedure onDone(utteranceID: JString); cdecl;
    259     procedure onError(utteranceID: JString); cdecl;
    260     procedure onStart(utteranceID: JString); cdecl;
    261   end;
    262 
    263   TJUtteranceProgressListener = class(TJavaGenericImport<JUtteranceProgressListenerClass, JUtteranceProgressListener>) end;
    264 
    265 implementation
    266 
    267 end.
    View Code

     

    2.实例代码 

      1 {********************************************************}
      2 {    XE10.1 + 小米手机5 = 通过测试                                                    }
      3 {    首先手机上必须安装语音包                            }
      4 {    语音包有                                            }
      5 {    1.“google Text To Speech” (不知为什么我的只发英文)  }
      6 {    2.“度秘语音引擎3.0” (中英都可以发音)                }
      7 {    3.“科大讯飞语音引擎3.0”(中英都可以发音)             }
      8 {    4.APK发音使用的是当前语音包                         }
      9 {    5.设置-更多设置-语言和输入法-文字转语音(TTS)输出  }
     10 {********************************************************}
     11 
     12 unit Unit1;
     13 
     14 interface
     15 
     16 uses
     17   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
     18   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
     19   FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls,
     20   //需要引入的单元
     21   FMX.Helpers.Android,//
     22   Androidapi.Helpers,//引入
     23   Androidapi.JNIBridge,//引入
     24   Androidapi.Jni.JavaTypes,//引入
     25   Androidapi.JNI.TTS;//引入
     26 
     27 type
     28   TForm1 = class(TForm)
     29     Button1: TButton;//发音
     30     Button2: TButton;//初始化
     31     Memo1: TMemo;//内容,可以是英语,可以是中文
     32     procedure Button1Click(Sender: TObject);
     33     procedure Button2Click(Sender: TObject);
     34   private
     35     type
     36       //倾听者
     37       TttsOnInitListener = class(TJavaLocal, JTextToSpeech_OnInitListener)
     38       private
     39         FParent: TForm1;
     40       public
     41         constructor Create(AParent: TForm1);
     42         procedure onInit(status: Integer); cdecl;
     43       end;
     44   private
     45     { Private declarations }
     46     ttsListener: TttsOnInitListener;//倾听者私有对象
     47     TTS: JTextToSpeech;//文字TO言语
     48     procedure SpeakOut;//说话
     49   public
     50     { Public declarations }
     51     constructor Create(AOwner: TComponent); override;
     52     destructor Destroy; override;
     53   end;
     54 
     55 var
     56   Form1: TForm1;
     57 
     58 implementation
     59 
     60 {$R *.fmx}
     61 {$R *.LgXhdpiPh.fmx ANDROID}
     62 //发音
     63 procedure TForm1.Button1Click(Sender: TObject);
     64 begin
     65   SpeakOut;
     66 end;
     67 //初始化
     68 procedure TForm1.Button2Click(Sender: TObject);
     69 begin
     70   TTS := TJTextToSpeech.JavaClass.init(SharedActivityContext, ttsListener);
     71 end;
     72 //建立私有对象
     73 constructor TForm1.Create(AOwner: TComponent);
     74 begin
     75   inherited;
     76   ttsListener := TttsOnInitListener.Create(self);
     77 end;
     78 //释放对象
     79 destructor TForm1.Destroy;
     80 begin
     81   if Assigned(TTS) then
     82   begin
     83     TTS.stop;
     84     TTS.shutdown;
     85     TTS := nil;
     86   end;
     87   ttsListener := nil;
     88   inherited;
     89 end;
     90 //把要朗读的文字指定给 TTS 引擎
     91 procedure TForm1.SpeakOut;
     92 var
     93   text: JString;
     94 begin
     95   text := StringToJString(Memo1.Lines.text);
     96   TTS.speak(text, TJTextToSpeech.JavaClass.QUEUE_FLUSH, nil);
     97 end;
     98 
     99 { TForm1.TttsOnInitListener }
    100 
    101 constructor TForm1.TttsOnInitListener.Create(AParent: TForm1);
    102 begin
    103   inherited Create;
    104   FParent := AParent;
    105 end;
    106 
    107 procedure TForm1.TttsOnInitListener.onInit(status: Integer);
    108 var
    109   Result: Integer;
    110 begin
    111   if (status = TJTextToSpeech.JavaClass.SUCCESS) then
    112   begin
    113     Result := FParent.TTS.setLanguage(TJLocale.JavaClass.US); // 这是指定这美语
    114     if (Result = TJTextToSpeech.JavaClass.LANG_MISSING_DATA) or
    115       (Result = TJTextToSpeech.JavaClass.LANG_NOT_SUPPORTED) then
    116       //这里在XE10.1中提示“只能在主线程中使用此提示”
    117       //ShowMessage('不支持这种语言!')
    118     else
    119     begin
    120       FParent.Button1.Enabled := True;
    121       FParent.Button2.Enabled := False;
    122     end;
    123   end
    124   else
    125   begin
    126     //ShowMessage('初始化失败!');
    127   end;
    128 end;
    129 
    130 end.
    View Code

     

  • 相关阅读:
    sql sever 的两种写法
    多站点IIS用户安全权限设置图解教程
    phpmyadmin“无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。”报错解决办法
    天下无难事只怕有心人
    apache配置上传目录禁止运行php的方法
    C语言|博客作业03
    C语言|博客作业07
    C语言|博客作业05
    2019秋季第一周作业
    C语言|博客作业06
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4633779.html
Copyright © 2020-2023  润新知