eSpeak NG is an open source speech synthesizer that supports more than hundred languages and accents.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

make_espeak.iss 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. ; This is the script for "Inno Setup 5" to create the setup_espeak.exe installer for Windows
  2. [Setup]
  3. AppName=eSpeak
  4. AppVerName=eSpeak version 1.47.14
  5. AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details).
  6. WindowVisible=yes
  7. DefaultDirName={pf}\eSpeak
  8. DefaultGroupName=eSpeak
  9. OutputBaseFilename=setup_espeak
  10. Compression=lzma
  11. SolidCompression=yes
  12. ShowLanguageDialog=auto
  13. [Icons]
  14. Name: "{group}\TTSApp"; Filename: "{app}\TTSApp.exe"; WorkingDir: "{app}"
  15. [InstallDelete]
  16. Type: files; Name: "{app}\espeak.dll"
  17. Type: files; Name: "{app}\espeak-data\voices\*"
  18. Type: filesandordirs; Name: "{app}\espeak-data\voices\en"
  19. Type: filesandordirs; Name: "{app}\espeak-data\voices\asia"
  20. Type: filesandordirs; Name: "{app}\espeak-data\voices\europe"
  21. Type: filesandordirs; Name: "{app}\espeak-data\voices\other"
  22. Type: filesandordirs; Name: "{app}\espeak-data\voices\test"
  23. Type: filesandordirs; Name: "{app}\docs"
  24. [Dirs]
  25. Name: "{app}\espeak-data\soundicons"
  26. Name: "{app}\espeak-data\mbrola"
  27. [Files]
  28. Source: "espeak_sapi.dll"; DestDir: "{app}"; Flags: regserver promptifolder replacesameversion
  29. Source: "TTSApp.exe"; DestDir:"{app}"
  30. Source: "espeak-data\*"; DestDir: "{app}\espeak-data"; Flags: recursesubdirs
  31. Source: "dictsource\*"; DestDir: "{app}\dictsource"; Flags: recursesubdirs
  32. Source: "docs\*"; DestDir: "{app}\docs"; Flags: recursesubdirs
  33. Source: "command_line\*"; DestDir: "{app}\command_line"
  34. Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
  35. Source: "License.txt"; DestDir: "{app}";
  36. Source: "ChangeLog.txt"; DestDir: "{app}";
  37. [Registry]
  38. Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
  39. [Languages]
  40. Name: "en"; MessagesFile: "compiler:Default.isl"
  41. Name: "af"; MessagesFile: "compiler:Languages\Afrikaans.isl"
  42. Name: "bg"; MessagesFile: "compiler:Languages\Bulgarian.isl"
  43. Name: "bs"; MessagesFile: "compiler:Languages\Bosnian.isl"
  44. Name: "cs"; MessagesFile: "compiler:Languages\Czech.isl"
  45. Name: "da"; MessagesFile: "compiler:Languages\Danish.isl"
  46. Name: "de"; MessagesFile: "compiler:Languages\German.isl"
  47. Name: "el"; MessagesFile: "compiler:Languages\Greek.isl"
  48. Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"
  49. Name: "fa"; MessagesFile: "compiler:Languages\Farsi.isl"
  50. Name: "fi"; MessagesFile: "compiler:Languages\Finnish.isl"
  51. Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
  52. Name: "hi"; MessagesFile: "compiler:Languages\Hindi.islu"
  53. Name: "hr"; MessagesFile: "compiler:Languages\Croatian.isl"
  54. Name: "hu"; MessagesFile: "compiler:Languages\Hungarian.isl"
  55. Name: "id"; MessagesFile: "compiler:Languages\Indonesian-5.1.11.isl"
  56. Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
  57. Name: "ka"; MessagesFile: "compiler:Languages\Georgian.islu"
  58. Name: "lv"; MessagesFile: "compiler:Languages\Latvian.isl"
  59. Name: "ne"; MessagesFile: "compiler:Languages\Nepali.islu"
  60. Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
  61. Name: "no"; MessagesFile: "compiler:Languages\Norwegian.isl"
  62. Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl"
  63. Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl"
  64. Name: "ro"; MessagesFile: "compiler:Languages\Romanian.isl"
  65. Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
  66. Name: "sk"; MessagesFile: "compiler:Languages\Slovak.isl"
  67. Name: "sr"; MessagesFile: "compiler:Languages\Serbian.isl"
  68. Name: "tr"; MessagesFile: "compiler:Languages\Turkish.isl"
  69. Name: "vi"; MessagesFile: "compiler:Languages\Vietnamese.isl"
  70. Name: "zh"; MessagesFile: "compiler:Languages\ChineseSimp-12-5.1.11.isl"
  71. [CustomMessages]
  72. v1=Select which voices to install
  73. v2=or press Enter to accept defaults
  74. v3=Enter voice names, eg: (for Portuguese) pt, or with a variant, eg: pt+f3
  75. bs.v1=Odaberite jezik kojeg želite instalirati
  76. bs.v2=ili pritisnite Enter za prihvat zadanih.
  77. bs.v3=Upišite, npr. bs (za Bosanski) ili s varjantom: bs+f3
  78. fr.v1=Sélectionnez les voix à installer
  79. fr.v2=ou appuyez sur Entrée pour accepter les valeurs par défaut.
  80. fr.v3=Entrez le nom des voix, ex : (pour le Français) fr, ou avec une variante ex : fr+f3
  81. hr.v1=Odaberite jezik kojeg želite instalirati
  82. hr.v2=ili pritisnite Enter za prihvat zadanih.
  83. hr.v3=Upišite, npr. hr (za Hrvatski) ili s varjantom: hr+f3
  84. pt.v1=Seleccione as vozes que pretende instalar
  85. pt.v2=ou precione enter para aceitar as predefinidas.
  86. pt.v3=Introduza os nomes das vozes, ex: (Brazil) pt (ou Portugal) pt-pt, ou com outras caracter?sticas, ex: pt+f3
  87. sr.v1=Molimo vas da odaberete glasove, koje želite da instalirate
  88. sr.v2=ili pritisnite Enter za instalaciju podrazumevanih glasova.
  89. sr.v3=Da odaberete glas, unesite ime glasa kojeg želite instalirati, na primer sr, ili sr+f3
  90. ne.v1=भित्र्याउन चाहेको आवाजको चयन गर्नु होस् ।
  91. ne.v2=अथवा यसमा निर्धारण गरिएको आवाजलाई नै चयन गर्ने हो भने ईन्टर कुञ्जीलाई दबाउनु होस् ।
  92. ne.v3=आवाजको नाम प्रविष्टी गर्नु होस् , जस्तै: नेपालीका लागि ne, अथवा स्वरको पनि चयन गर्ने हो भने ne+f3
  93. hi.v1=स्थापना करने के लिए पसन्दिदा आवाजों को चयन करें ।
  94. hi.v2=अगर आप कि चयन इसमें निर्दारित आवाज हि हो तो केवल ईन्टर कुञ्जी दबाए ।
  95. hi.v3=आवाज कि नाम प्रविष्टी करें, जैसा कि हिन्दी के लिए hi, और किसि स्वर भि चयन करना चाहते हो तो hi+f3
  96. [Code]
  97. var
  98. UILanguage: Integer;
  99. UIVoice: String;
  100. Page: TInputQueryWizardPage;
  101. voices_installed: array [0..200] of String;
  102. n_voices_installed: Integer;
  103. const
  104. sEspeak = 'eSpeak-';
  105. RegVoice1 = 'Software\Microsoft\Speech\Voices\Tokens\eSpeak';
  106. RegPhConv = 'Software\Microsoft\Speech\PhoneConverters\Tokens';
  107. function VoiceFromLanguage(language: Integer): String;
  108. var
  109. lang_main: Integer;
  110. begin
  111. lang_main := language and $3ff;
  112. Result := 'en';
  113. // Translation from microsoft codes to language codes
  114. // Used to set default voices for installation.
  115. case lang_main of
  116. $02: Result := 'bg';
  117. $03: Result := 'ca';
  118. $04: Result := 'zh';
  119. $05: Result := 'cs';
  120. $06: Result := 'da';
  121. $07: Result := 'de';
  122. $08: Result := 'el';
  123. $09: Result := 'en';
  124. $0a: Result := 'es-la es-la+m3 es-la+f3';
  125. $0b: Result := 'fi';
  126. $0c: Result := 'fr';
  127. $0e: Result := 'hu';
  128. $0f: Result := 'is';
  129. $10: Result := 'it';
  130. $12: Result := 'ko';
  131. $13: Result := 'nl';
  132. $14: Result := 'no';
  133. $15: Result := 'pl';
  134. $16: Result := 'pt';
  135. $18: Result := 'ro';
  136. $19: Result := 'ru';
  137. $1a: Result := 'hr';
  138. $1b: Result := 'sk';
  139. $1c: Result := 'sq';
  140. $1d: Result := 'sv';
  141. $1f: Result := 'tr';
  142. $20: Result := 'ur';
  143. $21: Result := 'id';
  144. $25: Result := 'et';
  145. $26: Result := 'lv';
  146. $27: Result := 'lt';
  147. $29: Result := 'fa';
  148. $2a: Result := 'vi';
  149. $2b: Result := 'hy';
  150. //$2c: Result := 'az';
  151. //$2d: Result := 'eu';
  152. $2f: Result := 'mk';
  153. $36: Result := 'af';
  154. $37: Result := 'kn';
  155. $39: Result := 'hi';
  156. //$3a: Result := 'mt';
  157. $3c: Result := 'ga';
  158. $3e: Result := 'ms';
  159. //$3f: Result := 'kk';
  160. $41: Result := 'sw';
  161. //$44: Result := 'tt';
  162. $46: Result := 'pa';
  163. //$48: Result := 'or';
  164. $49: Result := 'ta';
  165. $46: Result := 'pa';
  166. $4a: Result := 'te';
  167. $4b: Result := 'kn';
  168. $4c: Result := 'ml';
  169. //$4d: Result := 'as';
  170. //$50: Result := 'mn';
  171. $52: Result := 'cy';
  172. //$5e: Result := 'am';
  173. $61: Result := 'ne';
  174. //$87: Result := 'rw';
  175. //$88: Result := 'wo';
  176. end;
  177. // is there a match on the full language code?
  178. case language of
  179. $80a: Result := 'es-la es-la+f3 es-la+m3';
  180. $c0a: Result := 'es';
  181. $816: Result := 'pt-pt es-la';
  182. $41a: Result := 'hr';
  183. $81a: Result := 'sr';
  184. $c1a: Result := 'sr';
  185. $141a: Result := 'bs';
  186. end;
  187. end;
  188. function LanguageFromVoice(voice: String): String;
  189. var
  190. value: Integer;
  191. lang1: String;
  192. len: Integer;
  193. begin
  194. value := $409; // default en-us
  195. lang1 := Copy(voice,0,2);
  196. if lang1 = 'mb' then
  197. begin
  198. lang1 := Copy(voice,3,3);
  199. len := Length(voice);
  200. if len > 8 then
  201. lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en'
  202. end;
  203. // Used to set the correct Microsoft language code in the registry
  204. // when a SAPI5 voice is installed.
  205. case lang1 of
  206. 'af': value := $436;
  207. 'am': value := $45e;
  208. 'an': value := $40a; // Aragon, use code for Spanish
  209. 'as': value := $44d;
  210. 'az': value := $42c;
  211. 'bg': value := $402;
  212. 'bn': value := $445;
  213. 'bs': value := $41a; // should be $141a but Jaws crashes on startup
  214. 'ca': value := $403;
  215. 'cs': value := $405;
  216. 'cy': value := $452;
  217. 'da': value := $406;
  218. 'de': value := $407;
  219. 'dv': value := $465;
  220. 'el': value := $408;
  221. 'en': value := $409;
  222. 'es': value := $40a;
  223. 'et': value := $425;
  224. 'eu': value := $42d;
  225. 'fa': value := $429;
  226. 'fi': value := $40b;
  227. 'fil': value := $464;
  228. 'fr': value := $40c;
  229. 'ga': value := $83c;
  230. 'gu': value := $447;
  231. 'hi': value := $439;
  232. 'hr': value := $41a;
  233. 'hu': value := $40e;
  234. 'hy': value := $42b;
  235. 'id': value := $421;
  236. 'is': value := $40f;
  237. 'it': value := $410;
  238. 'ka': value := $437;
  239. 'kk': value := $43f;
  240. 'kn': value := $44b;
  241. 'ko': value := $412;
  242. 'lt': value := $427;
  243. 'lv': value := $426;
  244. 'mk': value := $42f;
  245. 'ml': value := $44c;
  246. 'mn': value := $450;
  247. 'ms': value := $43e;
  248. 'mt': value := $43a;
  249. 'my': value := $455;
  250. 'ne': value := $461;
  251. 'nl': value := $413;
  252. 'no': value := $414;
  253. 'or': value := $448;
  254. 'pa': value := $446;
  255. 'pl': value := $415;
  256. 'pt': value := $416;
  257. 'ro': value := $418;
  258. 'ru': value := $419;
  259. 'rw': value := $487;
  260. 'si': value := $45b;
  261. 'sk': value := $41b;
  262. 'sl': value := $424;
  263. 'sq': value := $41c;
  264. 'sr': value := $81a;
  265. 'sv': value := $41d;
  266. 'sw': value := $441;
  267. 'ta': value := $449;
  268. 'te': value := $44a;
  269. 'tg': value := $45e; // 'am'
  270. 'tl': value := $464;
  271. 'tn': value := $432;
  272. 'tr': value := $41f;
  273. 'tt': value := $444;
  274. 'ur': value := $420;
  275. 'vi': value := $42a;
  276. 'wo': value := $488;
  277. 'zh': value := $804;
  278. // mbrola voices
  279. '-af': value := $436;
  280. '-br': value := $416;
  281. '-ca': value := $c0c;
  282. '-cr': value := $41a;
  283. '-cz': value := $405;
  284. '-de': value := $407;
  285. '-en': value := $809;
  286. '-es': value := $40a;
  287. '-fr': value := $40c;
  288. '-gr': value := $408;
  289. '-hu': value := $40e;
  290. '-ic': value := $40f;
  291. '-in': value := $439;
  292. '-ir': value := $429;
  293. '-it': value := $410;
  294. '-mx': value := $80a;
  295. '-nl': value := $413;
  296. '-pl': value := $415;
  297. '-pt': value := $816;
  298. '-ro': value := $418;
  299. '-sw': value := $41d;
  300. '-us': value := $409;
  301. '-vz': value := $200a;
  302. end;
  303. // check for specific voices
  304. case voice of
  305. 'pt-pt': value := $816;
  306. end;
  307. Result := Format('%X',[value]);
  308. end;
  309. // is the language number already in a PhoneConvertor ?
  310. function CheckPhoneConvertors(Lcode: String): Integer;
  311. var
  312. Convertors: TArrayOfString;
  313. ix: Integer;
  314. len: Integer;
  315. s1: String;
  316. s2: String;
  317. sLangs: String;
  318. begin
  319. Result := 0;
  320. len := Length(Lcode);
  321. if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, RegPhConv, Convertors) then
  322. begin
  323. for ix := 0 to GetArrayLength(Convertors) - 1 do
  324. begin
  325. s1 := RegPhConv + '\' + Convertors[ix] + '\Attributes';
  326. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  327. begin
  328. s2 := Copy(sLangs, 1, len);
  329. if s2 = Lcode then
  330. Result := 1;
  331. if sLangs = Lcode then
  332. Result := 1;
  333. if Pos(';' + Lcode, sLangs) > 0 then
  334. Result := 1;
  335. end;
  336. end;
  337. end;
  338. end;
  339. // ensure the language number is included in a PhoneConvertor
  340. procedure SetPhoneConvertor(Lcode: String);
  341. var
  342. done: Boolean;
  343. s1: String;
  344. sLangs: String;
  345. begin
  346. if CheckPhoneConvertors(Lcode) = 0 then
  347. begin
  348. done := False;
  349. s1 := RegPhConv + '\Universal\Attributes';
  350. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  351. begin
  352. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  353. end;
  354. if done = False then
  355. begin
  356. s1 := RegPhConv + '\eSpeak\Attributes';
  357. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) = False then
  358. begin
  359. // add 'eSpeak' dummy PhoneConvertor
  360. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'CLSID','{9185F743-1143-4C28-86B5-BFF14F20E5C8}');
  361. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'PhoneMap','- 0001');
  362. RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language','');
  363. end;
  364. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  365. begin
  366. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  367. end;
  368. end;
  369. end;
  370. end;
  371. procedure SetupVoice(Voice: String; Index: Integer);
  372. var
  373. ix: Integer;
  374. RegVoice2: String;
  375. RegVoice2a: String;
  376. VoiceUC: String;
  377. Lcode: String;
  378. begin
  379. Lcode := LanguageFromVoice(Voice);
  380. if Index = 0 then
  381. RegVoice2 := RegVoice1
  382. else
  383. RegVoice2 := RegVoice1 + Format('_%d',[Index]);
  384. RegVoice2a := RegVoice2 + '\Attributes';
  385. if Voice = 'default' then
  386. VoiceUC := 'default'
  387. else
  388. VoiceUC := Uppercase(Voice);
  389. // check for duplicate voice names
  390. for ix := 0 to n_voices_installed - 1 do begin
  391. if voices_installed[ix] = VoiceUC then
  392. Exit;
  393. end;
  394. if n_voices_installed < 200 then begin
  395. voices_installed[n_voices_installed] := VoiceUC;
  396. n_voices_installed := n_voices_installed + 1;
  397. end;
  398. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'',sEspeak+VoiceUC);
  399. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'CLSID','{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}');
  400. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'Path',ExpandConstant('{app}'));
  401. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'VoiceName',Voice);
  402. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Name',sEspeak+Voice);
  403. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Gender','Male');
  404. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Age','Adult');
  405. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Language',Lcode);
  406. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Vendor','http://espeak.sf.net');
  407. SetPhoneConvertor(Lcode);
  408. end;
  409. procedure CurStepChanged(CurStep: TSetupStep);
  410. var
  411. field: Integer;
  412. Index: Integer;
  413. ix: Integer;
  414. ix2: Integer;
  415. Line: String;
  416. Voice: String;
  417. Voice2: String;
  418. separator: String;
  419. begin
  420. if CurStep = ssPostInstall then
  421. begin
  422. separator := ' ';
  423. Index := 0;
  424. for field := 0 to 4 do begin
  425. Line := Page.Values[field];
  426. ix := 1;
  427. ix2 := 1;
  428. while ix2 > 0 do begin
  429. ix2 := Pos(separator,Copy(Line,ix,999));
  430. if ix2 = 0 then
  431. Voice := Copy(Line,ix,999)
  432. else
  433. Voice := Copy(Line,ix,ix2-1);
  434. Voice2 := Trim(Voice);
  435. if Voice2 <> '' then begin
  436. SetUpVoice(Trim(Voice),Index);
  437. Index := Index + 1;
  438. end;
  439. ix := ix + ix2;
  440. end;
  441. end;
  442. end;
  443. end;
  444. procedure InitializeWizard;
  445. var
  446. lang: String;
  447. voice2: String;
  448. uilang: String;
  449. begin
  450. // Create the language selection page
  451. UILanguage := GetUILanguage;
  452. UIVoice := VoiceFromLanguage(UILanguage);
  453. uilang := Format(' (Language code %x)',[UILanguage]);
  454. lang := ActiveLanguage;
  455. Page := CreateInputQueryPage(wpSelectDir,CustomMessage('v1'),CustomMessage('v2')+uilang,CustomMessage('v3'));
  456. // Add items (False means it's not a password edit)
  457. Page.Add('', False);
  458. Page.Add('', False);
  459. Page.Add('', False);
  460. Page.Add('', False);
  461. Page.Add('', False);
  462. // Set initial values (optional)
  463. if UIVoice = 'en' then
  464. voice2 := 'en-us'
  465. else
  466. voice2 := 'en';
  467. if Pos('+',UIVoice) = 0 then
  468. Page.Values[0] := Format('%s %s',[UIVoice, UIVoice+'+f2'])
  469. else
  470. Page.Values[0] := Format('%s',[UIVoice]);
  471. Page.Values[1] := Format('%s',[voice2]);
  472. n_voices_installed := 0;
  473. end;
  474. procedure ClearRegistry;
  475. var
  476. Index: Integer;
  477. RegVoice2: String;
  478. exists: Boolean;
  479. begin
  480. // remove all espeak voices from the registry
  481. exists := True;
  482. Index := 0;
  483. while exists do begin
  484. if Index = 0 then
  485. RegVoice2 := RegVoice1
  486. else
  487. RegVoice2 := RegVoice1 + Format('_%d',[Index]);
  488. exists := RegKeyExists(HKEY_LOCAL_MACHINE,RegVoice2);
  489. RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE,RegVoice2);
  490. Index := Index + 1;
  491. end;
  492. end;
  493. function InitializeSetup: Boolean;
  494. begin
  495. // remove all espeak voices from the registry
  496. ClearRegistry;
  497. result := True;
  498. end;
  499. function InitializeUninstall: Boolean;
  500. begin
  501. // remove all espeak voices from the registry
  502. ClearRegistry;
  503. result := True;
  504. end;