相关资料:
注意:在手机上必须选安装文字转语音引擎“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.
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.