/native/external/espeak/platforms/windows/make_espeak.iss

http://eyes-free.googlecode.com/ · Unknown · 394 lines · 340 code · 54 blank · 0 comment · 0 complexity · 35246a6ebd99f69fe663d0377a0fb40e MD5 · raw file

  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.39
  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. [InstallDelete]
  14. Type: files; Name: "{app}\espeak.dll"
  15. [Dirs]
  16. Name: "{app}\espeak-data\soundicons"
  17. Name: "{app}\espeak-data\mbrola"
  18. [Files]
  19. Source: "espeak_sapi.dll"; DestDir: "{app}"; Flags: regserver promptifolder replacesameversion
  20. Source: "TTSApp.exe"; DestDir:"{app}"
  21. Source: "espeak-data\*"; DestDir: "{app}\espeak-data"; Flags: recursesubdirs
  22. Source: "dictsource\*"; DestDir: "{app}\dictsource"; Flags: recursesubdirs
  23. Source: "docs\*"; DestDir: "{app}\docs"; Flags: recursesubdirs
  24. Source: "command_line\*"; DestDir: "{app}\command_line"
  25. Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
  26. Source: "License.txt"; DestDir: "{app}";
  27. [Registry]
  28. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
  29. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_1"; Flags: deletekey uninsdeletekey
  30. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_2"; Flags: deletekey uninsdeletekey
  31. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_3"; Flags: deletekey uninsdeletekey
  32. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_4"; Flags: deletekey uninsdeletekey
  33. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_5"; Flags: deletekey uninsdeletekey
  34. Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
  35. [Languages]
  36. Name: "en"; MessagesFile: "compiler:Default.isl"
  37. Name: "af"; MessagesFile: "compiler:Languages\Afrikaans.isl"
  38. Name: "bs"; MessagesFile: "compiler:Languages\Bosnian.isl"
  39. Name: "cs"; MessagesFile: "compiler:Languages\Czech.isl"
  40. Name: "de"; MessagesFile: "compiler:Languages\German.isl"
  41. Name: "el"; MessagesFile: "compiler:Languages\Greek.isl"
  42. Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"
  43. Name: "fi"; MessagesFile: "compiler:Languages\Finnish.isl"
  44. Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
  45. Name: "hr"; MessagesFile: "compiler:Languages\Croatian.isl"
  46. Name: "hu"; MessagesFile: "compiler:Languages\Hungarian.isl"
  47. Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
  48. Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
  49. Name: "no"; MessagesFile: "compiler:Languages\Norwegian.isl"
  50. Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl"
  51. Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl"
  52. Name: "ro"; MessagesFile: "compiler:Languages\Romanian.isl"
  53. Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
  54. Name: "sk"; MessagesFile: "compiler:Languages\Slovak.isl"
  55. Name: "sr"; MessagesFile: "compiler:Languages\Serbian.isl"
  56. Name: "tr"; MessagesFile: "compiler:Languages\Turkish.isl"
  57. [CustomMessages]
  58. v1=Select which voices to install
  59. v2=or press Enter to accept defaults
  60. v3=Enter voice names, eg: (for Portuguese) pt, or with a variant, eg: pt+f3
  61. bs.v1=Odaberite jezik kojeg želite instalirati
  62. bs.v2=ili pritisnite Enter za prihvat zadanih.
  63. bs.v3=Upišite, npr. bs (za Bosanski) ili s varjantom: bs+f3
  64. fr.v1=Sélectionnez les voix ? installer
  65. fr.v2=ou appuyez sur Entrée pour accepter les valeurs par défaut.
  66. fr.v3=Entrez le nom des voix, ex : (pour le Français) fr, ou avec une variante ex : fr+f3
  67. hr.v1=Odaberite jezik kojeg želite instalirati
  68. hr.v2=ili pritisnite Enter za prihvat zadanih.
  69. hr.v3=Upišite, npr. hr (za Hrvatski) ili s varjantom: hr+f3
  70. pt.v1=Seleccione as vozes que pretende instalar
  71. pt.v2=ou precione enter para aceitar as predefinidas.
  72. pt.v3=Introduza os nomes das vozes, ex: (Brazil) pt (ou Portugal) pt-pt, ou com outras caracter?sticas, ex: pt+f3
  73. sr.v1=Molimo vas da odaberete glasove, koje želite da instalirate
  74. sr.v2=ili pritisnite Enter za instalaciju podrazumevanih glasova.
  75. sr.v3=Da odaberete glas, unesite ime glasa kojeg želite instalirati, na primer sr, ili sr+f3
  76. [Code]
  77. var
  78. UILanguage: Integer;
  79. UIVoice: String;
  80. Page: TInputQueryWizardPage;
  81. const
  82. sEspeak = 'eSpeak-';
  83. RegVoice1 = 'Software\Microsoft\Speech\Voices\Tokens\eSpeak';
  84. RegPhConv = 'Software\Microsoft\Speech\PhoneConverters\Tokens';
  85. function VoiceFromLanguage(language: Integer): String;
  86. var
  87. lang_main: Integer;
  88. begin
  89. lang_main := language and $3ff;
  90. Result := 'en';
  91. // translation from microsoft codes to language codes
  92. case lang_main of
  93. $04: Result := 'zh';
  94. $05: Result := 'cs';
  95. $06: Result := 'da';
  96. $07: Result := 'de';
  97. $08: Result := 'el';
  98. $09: Result := 'en';
  99. $0a: Result := 'es-la';
  100. $0b: Result := 'fi';
  101. $0c: Result := 'fr';
  102. $0e: Result := 'hu';
  103. $0f: Result := 'is';
  104. $10: Result := 'it';
  105. $12: Result := 'ko';
  106. $13: Result := 'nl';
  107. $14: Result := 'no';
  108. $15: Result := 'pl';
  109. $16: Result := 'pt';
  110. $18: Result := 'ro';
  111. $19: Result := 'ru';
  112. $1a: Result := 'hr';
  113. $1b: Result := 'sk';
  114. $1d: Result := 'sv';
  115. $1f: Result := 'tr';
  116. $21: Result := 'id';
  117. $2a: Result := 'vi';
  118. $2f: Result := 'mk';
  119. $36: Result := 'af';
  120. $39: Result := 'hi';
  121. $41: Result := 'sw';
  122. $49: Result := 'ta';
  123. $52: Result := 'cy';
  124. $87: Result := 'rw';
  125. end;
  126. // is there a match on the full language code?
  127. case language of
  128. $40a: Result := 'es';
  129. $c0a: Result := 'es';
  130. $816: Result := 'pt-pt';
  131. $41a: Result := 'hr';
  132. $81a: Result := 'sr';
  133. $c1a: Result := 'sr';
  134. $141a: Result := 'bs';
  135. end;
  136. end;
  137. function LanguageFromVoice(voice: String): String;
  138. var
  139. value: Integer;
  140. lang1: String;
  141. len: Integer;
  142. begin
  143. value := $409; // default en-us
  144. lang1 := Copy(voice,0,2);
  145. if lang1 = 'mb' then
  146. begin
  147. lang1 := Copy(voice,3,3);
  148. len := Length(voice);
  149. if len > 8 then
  150. lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en'
  151. end;
  152. case lang1 of
  153. 'af': value := $436;
  154. 'bs': value := $41a; // should be $141a but Jaws crashes on startup
  155. 'cs': value := $405;
  156. 'cy': value := $452;
  157. 'da': value := $406;
  158. 'de': value := $407;
  159. 'el': value := $408;
  160. 'en': value := $409;
  161. 'es': value := $40a;
  162. 'fi': value := $40b;
  163. 'fr': value := $40c;
  164. 'hi': value := $439;
  165. 'hr': value := $41a;
  166. 'hu': value := $40e;
  167. 'id': value := $421;
  168. 'is': value := $40f;
  169. 'it': value := $410;
  170. 'ko': value := $412;
  171. 'mk': value := $42f;
  172. 'nl': value := $413;
  173. 'no': value := $414;
  174. 'pl': value := $415;
  175. 'pt': value := $416;
  176. 'ro': value := $418;
  177. 'ru': value := $419;
  178. 'rw': value := $487;
  179. 'sk': value := $41b;
  180. 'sr': value := $81a;
  181. 'sv': value := $41d;
  182. 'sw': value := $441;
  183. 'ta': value := $449;
  184. 'tr': value := $41f;
  185. 'vi': value := $42a;
  186. 'zh': value := $804;
  187. // mbrola voices
  188. '-af': value := $436;
  189. '-br': value := $416;
  190. '-ca': value := $c0c;
  191. '-cr': value := $41a;
  192. '-cz': value := $405;
  193. '-de': value := $407;
  194. '-en': value := $809;
  195. '-es': value := $40a;
  196. '-fr': value := $40c;
  197. '-gr': value := $408;
  198. '-hu': value := $40e;
  199. '-ic': value := $40f;
  200. '-in': value := $439;
  201. '-it': value := $410;
  202. '-mx': value := $80a;
  203. '-nl': value := $413;
  204. '-pl': value := $415;
  205. '-pt': value := $816;
  206. '-ro': value := $418;
  207. '-sw': value := $41d;
  208. '-us': value := $409;
  209. '-vz': value := $200a;
  210. end;
  211. // check for specific voices
  212. case voice of
  213. 'pt-pt': value := $816;
  214. end;
  215. Result := Format('%X',[value]);
  216. end;
  217. // is the language number already in a PhoneConvertor ?
  218. function CheckPhoneConvertors(Lcode: String): Integer;
  219. var
  220. Convertors: TArrayOfString;
  221. ix: Integer;
  222. len: Integer;
  223. s1: String;
  224. s2: String;
  225. sLangs: String;
  226. begin
  227. Result := 0;
  228. len := Length(Lcode);
  229. if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, RegPhConv, Convertors) then
  230. begin
  231. for ix := 0 to GetArrayLength(Convertors) - 1 do
  232. begin
  233. s1 := RegPhConv + '\' + Convertors[ix] + '\Attributes';
  234. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  235. begin
  236. s2 := Copy(sLangs, 1, len);
  237. if s2 = Lcode then
  238. Result := 1;
  239. if sLangs = Lcode then
  240. Result := 1;
  241. if Pos(';' + Lcode, sLangs) > 0 then
  242. Result := 1;
  243. end;
  244. end;
  245. end;
  246. end;
  247. // ensure the language number is included in a PhoneConvertor
  248. procedure SetPhoneConvertor(Lcode: String);
  249. var
  250. done: Boolean;
  251. s1: String;
  252. sLangs: String;
  253. begin
  254. if CheckPhoneConvertors(Lcode) = 0 then
  255. begin
  256. done := False;
  257. s1 := RegPhConv + '\Universal\Attributes';
  258. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  259. begin
  260. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  261. end;
  262. if done = False then
  263. begin
  264. s1 := RegPhConv + '\eSpeak\Attributes';
  265. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) = False then
  266. begin
  267. // add 'eSpeak' dummy PhoneConvertor
  268. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'CLSID','{9185F743-1143-4C28-86B5-BFF14F20E5C8}');
  269. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'PhoneMap','- 0001');
  270. RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language','');
  271. end;
  272. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  273. begin
  274. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  275. end;
  276. end;
  277. end;
  278. end;
  279. procedure SetupVoice(Voice, Lcode: String; Index: Integer);
  280. var
  281. RegVoice2: String;
  282. RegVoice2a: String;
  283. VoiceUC: String;
  284. begin
  285. if Index = 0 then
  286. RegVoice2 := RegVoice1
  287. else
  288. RegVoice2 := RegVoice1 + Format('_%d',[Index]);
  289. RegVoice2a := RegVoice2 + '\Attributes';
  290. if Voice = 'default' then
  291. VoiceUC := 'default'
  292. else
  293. VoiceUC := Uppercase(Voice);
  294. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'',sEspeak+VoiceUC);
  295. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'CLSID','{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}');
  296. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'Path',ExpandConstant('{app}'));
  297. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'VoiceName',Voice);
  298. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Name',sEspeak+Voice);
  299. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Gender','Male');
  300. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Age','Adult');
  301. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Language',Lcode);
  302. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Vendor','Jonathan Duddington');
  303. SetPhoneConvertor(Lcode);
  304. end;
  305. procedure CurStepChanged(CurStep: TSetupStep);
  306. var
  307. ix: Integer;
  308. begin
  309. if CurStep = ssPostInstall then
  310. begin
  311. for ix := 0 to 5 do begin
  312. if Page.Values[ix] <> '' then
  313. SetUpVoice(Page.Values[ix],LanguageFromVoice(Page.Values[ix]),ix);
  314. end;
  315. end;
  316. end;
  317. procedure InitializeWizard;
  318. var
  319. lang: String;
  320. begin
  321. // Create the language selection page
  322. lang := ActiveLanguage;
  323. Page := CreateInputQueryPage(wpSelectDir,CustomMessage('v1'),CustomMessage('v2'),CustomMessage('v3'));
  324. // Add items (False means it's not a password edit)
  325. Page.Add('', False);
  326. Page.Add('', False);
  327. Page.Add('', False);
  328. Page.Add('', False);
  329. Page.Add('', False);
  330. Page.Add('', False);
  331. UILanguage := GetUILanguage;
  332. UIVoice := VoiceFromLanguage(UILanguage);
  333. // Set initial values (optional)
  334. Page.Values[0] := UIVoice;
  335. Page.Values[1] := UIVoice+'+f2';
  336. if UIVoice = 'en' then
  337. Page.Values[2] := 'en-r'
  338. else
  339. Page.values[2] := 'en';
  340. end;