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 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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.26
  5. DefaultDirName={pf}\eSpeak
  6. DefaultGroupName=eSpeak
  7. OutputBaseFilename=setup_espeak
  8. Compression=lzma
  9. SolidCompression=yes
  10. [InstallDelete]
  11. Type: files; Name: "{app}\espeak.dll"
  12. [Dirs]
  13. Name: "{app}\espeak-data\soundicons"
  14. Name: "{app}\espeak-data\mbrola"
  15. [Files]
  16. Source: "espeak_sapi.dll"; DestDir: "{app}"; Flags: regserver promptifolder replacesameversion
  17. Source: "TTSApp.exe"; DestDir:"{app}"
  18. Source: "espeak-data\*"; DestDir: "{app}\espeak-data"; Flags: recursesubdirs
  19. Source: "dictsource2\*"; DestDir: "{app}\dictsource"
  20. Source: "docs\*"; DestDir: "{app}\docs"; Flags: recursesubdirs
  21. Source: "command_line\*"; DestDir: "{app}\command_line"
  22. Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
  23. [Registry]
  24. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
  25. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_1"; Flags: deletekey uninsdeletekey
  26. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_2"; Flags: deletekey uninsdeletekey
  27. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_3"; Flags: deletekey uninsdeletekey
  28. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_4"; Flags: deletekey uninsdeletekey
  29. Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_5"; Flags: deletekey uninsdeletekey
  30. Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
  31. [Code]
  32. var
  33. UILanguage: Integer;
  34. UIVoice: String;
  35. Page: TInputQueryWizardPage;
  36. const
  37. sEspeak = 'eSpeak-';
  38. RegVoice1 = 'Software\Microsoft\Speech\Voices\Tokens\eSpeak';
  39. RegPhConv = 'Software\Microsoft\Speech\PhoneConverters\Tokens';
  40. function VoiceFromLanguage(language: Integer): String;
  41. var
  42. lang_main: Integer;
  43. begin
  44. lang_main := language and $3ff;
  45. Result := 'af';
  46. // translation from microsoft codes to language codes
  47. case lang_main of
  48. $05: Result := 'cs';
  49. $07: Result := 'de';
  50. $08: Result := 'el';
  51. $0a: Result := 'es';
  52. $0b: Result := 'fi';
  53. $0c: Result := 'fr';
  54. $0e: Result := 'hu';
  55. $10: Result := 'it';
  56. $13: Result := 'nl';
  57. $14: Result := 'no';
  58. $15: Result := 'pl';
  59. $16: Result := 'pt';
  60. $18: Result := 'ro';
  61. $19: Result := 'ru';
  62. $1a: Result := 'hr';
  63. $1b: Result := 'sk';
  64. $1d: Result := 'sv';
  65. $2a: Result := 'vi';
  66. $36: Result := 'af';
  67. $39: Result := 'hi';
  68. $41: Result := 'sw';
  69. $52: Result := 'cy';
  70. end;
  71. end;
  72. function LanguageFromVoice(voice: String): String;
  73. var
  74. value: Integer;
  75. lang1: String;
  76. len: Integer;
  77. begin
  78. value := $409; // default en-us
  79. lang1 := Copy(voice,0,2);
  80. if lang1 = 'mb' then
  81. begin
  82. lang1 := Copy(voice,3,3);
  83. len := Length(voice);
  84. if len > 8 then
  85. lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en'
  86. end;
  87. case lang1 of
  88. 'af': value := $436;
  89. 'cs': value := $405;
  90. 'cy': value := $452;
  91. 'de': value := $407;
  92. 'el': value := $408;
  93. 'en': value := $409;
  94. 'es': value := $40a;
  95. 'fi': value := $40b;
  96. 'fr': value := $40c;
  97. 'hi': value := $439;
  98. 'hr': value := $41a;
  99. 'hu': value := $40e;
  100. 'is': value := $40f;
  101. 'it': value := $410;
  102. 'nl': value := $413;
  103. 'no': value := $414;
  104. 'pl': value := $415;
  105. 'pt': value := $416;
  106. 'ro': value := $418;
  107. 'ru': value := $419;
  108. 'sk': value := $41b;
  109. 'sv': value := $41d;
  110. 'sw': value := $441;
  111. 'vi': value := $42a;
  112. // mbrola voices
  113. '-af': value := $436;
  114. '-br': value := $416;
  115. '-ca': value := $c0c;
  116. '-cr': value := $41a;
  117. '-cz': value := $405;
  118. '-de': value := $407;
  119. '-en': value := $809;
  120. '-es': value := $40a;
  121. '-fr': value := $40c;
  122. '-gr': value := $408;
  123. '-hu': value := $40e;
  124. '-ic': value := $40f;
  125. '-in': value := $439;
  126. '-it': value := $410;
  127. '-mx': value := $80a;
  128. '-nl': value := $413;
  129. '-pl': value := $415;
  130. '-pt': value := $816;
  131. '-ro': value := $418;
  132. '-sw': value := $41d;
  133. '-us': value := $409;
  134. '-vz': value := $200a;
  135. end;
  136. // check for specific voices
  137. case voice of
  138. 'pt-pt': value := $816;
  139. end;
  140. Result := Format('%X',[value]);
  141. end;
  142. // is the language number already in a PhoneConvertor ?
  143. function CheckPhoneConvertors(Lcode: String): Integer;
  144. var
  145. Convertors: TArrayOfString;
  146. ix: Integer;
  147. len: Integer;
  148. s1: String;
  149. s2: String;
  150. sLangs: String;
  151. begin
  152. Result := 0;
  153. len := Length(Lcode);
  154. if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, RegPhConv, Convertors) then
  155. begin
  156. for ix := 0 to GetArrayLength(Convertors) - 1 do
  157. begin
  158. s1 := RegPhConv + '\' + Convertors[ix] + '\Attributes';
  159. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  160. begin
  161. s2 := Copy(sLangs, 1, len);
  162. if s2 = Lcode then
  163. Result := 1;
  164. if sLangs = Lcode then
  165. Result := 1;
  166. if Pos(';' + Lcode, sLangs) > 0 then
  167. Result := 1;
  168. end;
  169. end;
  170. end;
  171. end;
  172. // ensure the language number is included in a PhoneConvertor
  173. procedure SetPhoneConvertor(Lcode: String);
  174. var
  175. done: Boolean;
  176. s1: String;
  177. sLangs: String;
  178. begin
  179. if CheckPhoneConvertors(Lcode) = 0 then
  180. begin
  181. done := False;
  182. s1 := RegPhConv + '\Universal\Attributes';
  183. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  184. begin
  185. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  186. end;
  187. if done = False then
  188. begin
  189. s1 := RegPhConv + '\eSpeak\Attributes';
  190. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) = False then
  191. begin
  192. // add 'eSpeak' dummy PhoneConvertor
  193. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'CLSID','{9185F743-1143-4C28-86B5-BFF14F20E5C8}');
  194. RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'PhoneMap','- 0001');
  195. RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language','');
  196. end;
  197. if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then
  198. begin
  199. done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs);
  200. end;
  201. end;
  202. end;
  203. end;
  204. procedure SetupVoice(Voice, Lcode: String; Index: Integer);
  205. var
  206. RegVoice2: String;
  207. RegVoice2a: String;
  208. VoiceUC: String;
  209. begin
  210. if Index = 0 then
  211. RegVoice2 := RegVoice1
  212. else
  213. RegVoice2 := RegVoice1 + Format('_%d',[Index]);
  214. RegVoice2a := RegVoice2 + '\Attributes';
  215. if Voice = 'default' then
  216. VoiceUC := 'default'
  217. else
  218. VoiceUC := Uppercase(Voice);
  219. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'',sEspeak+VoiceUC);
  220. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'CLSID','{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}');
  221. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'Path',ExpandConstant('{app}'));
  222. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'VoiceName',Voice);
  223. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Name',sEspeak+Voice);
  224. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Gender','Male');
  225. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Age','Adult');
  226. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Language',Lcode);
  227. RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Vendor','Jonathan Duddington');
  228. SetPhoneConvertor(Lcode);
  229. end;
  230. procedure CurStepChanged(CurStep: TSetupStep);
  231. var
  232. ix: Integer;
  233. begin
  234. if CurStep = ssPostInstall then
  235. begin
  236. for ix := 0 to 5 do begin
  237. if Page.Values[ix] <> '' then
  238. SetUpVoice(Page.Values[ix],LanguageFromVoice(Page.Values[ix]),ix);
  239. end;
  240. end;
  241. end;
  242. procedure InitializeWizard;
  243. var
  244. lang: String;
  245. begin
  246. // Create the language selection page
  247. lang := ActiveLanguage;
  248. Page := CreateInputQueryPage(wpSelectDir,
  249. 'Select which voices to install', 'or press Enter to accept defaults',
  250. 'Enter voice names, eg: (for Portuguese) pt, or with a variant, eg: pt+13');
  251. // Add items (False means it's not a password edit)
  252. Page.Add('', False);
  253. Page.Add('', False);
  254. Page.Add('', False);
  255. Page.Add('', False);
  256. Page.Add('', False);
  257. Page.Add('', False);
  258. UILanguage := GetUILanguage;
  259. UIVoice := VoiceFromLanguage(UILanguage);
  260. // Set initial values (optional)
  261. Page.Values[0] := 'en';
  262. Page.Values[1] := UIVoice;
  263. Page.Values[2] := 'en-r';
  264. end;