git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@40 d46cf337-b52f-0410-862d-fd96e6ae7743master
; This is the script for "Inno Setup 5" to create the setup_espeak.exe installer for Windows | |||||
[Setup] | |||||
AppName=eSpeak | |||||
AppVerName=eSpeak version 1.26 | |||||
DefaultDirName={pf}\eSpeak | |||||
DefaultGroupName=eSpeak | |||||
OutputBaseFilename=setup_espeak | |||||
Compression=lzma | |||||
SolidCompression=yes | |||||
[InstallDelete] | |||||
Type: files; Name: "{app}\espeak.dll" | |||||
[Dirs] | |||||
Name: "{app}\espeak-data\soundicons" | |||||
Name: "{app}\espeak-data\mbrola" | |||||
[Files] | |||||
Source: "espeak_sapi.dll"; DestDir: "{app}"; Flags: regserver promptifolder replacesameversion | |||||
Source: "TTSApp.exe"; DestDir:"{app}" | |||||
Source: "espeak-data\*"; DestDir: "{app}\espeak-data"; Flags: recursesubdirs | |||||
Source: "dictsource2\*"; DestDir: "{app}\dictsource" | |||||
Source: "docs\*"; DestDir: "{app}\docs"; Flags: recursesubdirs | |||||
Source: "command_line\*"; DestDir: "{app}\command_line" | |||||
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme | |||||
[Registry] | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_1"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_2"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_3"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_4"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_5"; Flags: deletekey uninsdeletekey | |||||
Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey | |||||
[Code] | |||||
var | |||||
UILanguage: Integer; | |||||
UIVoice: String; | |||||
Page: TInputQueryWizardPage; | |||||
const | |||||
sEspeak = 'eSpeak-'; | |||||
RegVoice1 = 'Software\Microsoft\Speech\Voices\Tokens\eSpeak'; | |||||
RegPhConv = 'Software\Microsoft\Speech\PhoneConverters\Tokens'; | |||||
function VoiceFromLanguage(language: Integer): String; | |||||
var | |||||
lang_main: Integer; | |||||
begin | |||||
lang_main := language and $3ff; | |||||
Result := 'af'; | |||||
// translation from microsoft codes to language codes | |||||
case lang_main of | |||||
$05: Result := 'cs'; | |||||
$07: Result := 'de'; | |||||
$08: Result := 'el'; | |||||
$0a: Result := 'es'; | |||||
$0b: Result := 'fi'; | |||||
$0c: Result := 'fr'; | |||||
$0e: Result := 'hu'; | |||||
$10: Result := 'it'; | |||||
$13: Result := 'nl'; | |||||
$14: Result := 'no'; | |||||
$15: Result := 'pl'; | |||||
$16: Result := 'pt'; | |||||
$18: Result := 'ro'; | |||||
$19: Result := 'ru'; | |||||
$1a: Result := 'hr'; | |||||
$1b: Result := 'sk'; | |||||
$1d: Result := 'sv'; | |||||
$2a: Result := 'vi'; | |||||
$36: Result := 'af'; | |||||
$39: Result := 'hi'; | |||||
$41: Result := 'sw'; | |||||
$52: Result := 'cy'; | |||||
end; | |||||
end; | |||||
function LanguageFromVoice(voice: String): String; | |||||
var | |||||
value: Integer; | |||||
lang1: String; | |||||
len: Integer; | |||||
begin | |||||
value := $409; // default en-us | |||||
lang1 := Copy(voice,0,2); | |||||
if lang1 = 'mb' then | |||||
begin | |||||
lang1 := Copy(voice,3,3); | |||||
len := Length(voice); | |||||
if len > 8 then | |||||
lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en' | |||||
end; | |||||
case lang1 of | |||||
'af': value := $436; | |||||
'cs': value := $405; | |||||
'cy': value := $452; | |||||
'de': value := $407; | |||||
'el': value := $408; | |||||
'en': value := $409; | |||||
'es': value := $40a; | |||||
'fi': value := $40b; | |||||
'fr': value := $40c; | |||||
'hi': value := $439; | |||||
'hr': value := $41a; | |||||
'hu': value := $40e; | |||||
'is': value := $40f; | |||||
'it': value := $410; | |||||
'nl': value := $413; | |||||
'no': value := $414; | |||||
'pl': value := $415; | |||||
'pt': value := $416; | |||||
'ro': value := $418; | |||||
'ru': value := $419; | |||||
'sk': value := $41b; | |||||
'sv': value := $41d; | |||||
'sw': value := $441; | |||||
'vi': value := $42a; | |||||
// mbrola voices | |||||
'-af': value := $436; | |||||
'-br': value := $416; | |||||
'-ca': value := $c0c; | |||||
'-cr': value := $41a; | |||||
'-cz': value := $405; | |||||
'-de': value := $407; | |||||
'-en': value := $809; | |||||
'-es': value := $40a; | |||||
'-fr': value := $40c; | |||||
'-gr': value := $408; | |||||
'-hu': value := $40e; | |||||
'-ic': value := $40f; | |||||
'-in': value := $439; | |||||
'-it': value := $410; | |||||
'-mx': value := $80a; | |||||
'-nl': value := $413; | |||||
'-pl': value := $415; | |||||
'-pt': value := $816; | |||||
'-ro': value := $418; | |||||
'-sw': value := $41d; | |||||
'-us': value := $409; | |||||
'-vz': value := $200a; | |||||
end; | |||||
// check for specific voices | |||||
case voice of | |||||
'pt-pt': value := $816; | |||||
end; | |||||
Result := Format('%X',[value]); | |||||
end; | |||||
// is the language number already in a PhoneConvertor ? | |||||
function CheckPhoneConvertors(Lcode: String): Integer; | |||||
var | |||||
Convertors: TArrayOfString; | |||||
ix: Integer; | |||||
len: Integer; | |||||
s1: String; | |||||
s2: String; | |||||
sLangs: String; | |||||
begin | |||||
Result := 0; | |||||
len := Length(Lcode); | |||||
if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, RegPhConv, Convertors) then | |||||
begin | |||||
for ix := 0 to GetArrayLength(Convertors) - 1 do | |||||
begin | |||||
s1 := RegPhConv + '\' + Convertors[ix] + '\Attributes'; | |||||
if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then | |||||
begin | |||||
s2 := Copy(sLangs, 1, len); | |||||
if s2 = Lcode then | |||||
Result := 1; | |||||
if sLangs = Lcode then | |||||
Result := 1; | |||||
if Pos(';' + Lcode, sLangs) > 0 then | |||||
Result := 1; | |||||
end; | |||||
end; | |||||
end; | |||||
end; | |||||
// ensure the language number is included in a PhoneConvertor | |||||
procedure SetPhoneConvertor(Lcode: String); | |||||
var | |||||
done: Boolean; | |||||
s1: String; | |||||
sLangs: String; | |||||
begin | |||||
if CheckPhoneConvertors(Lcode) = 0 then | |||||
begin | |||||
done := False; | |||||
s1 := RegPhConv + '\Universal\Attributes'; | |||||
if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then | |||||
begin | |||||
done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs); | |||||
end; | |||||
if done = False then | |||||
begin | |||||
s1 := RegPhConv + '\eSpeak\Attributes'; | |||||
if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) = False then | |||||
begin | |||||
// add 'eSpeak' dummy PhoneConvertor | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'CLSID','{9185F743-1143-4C28-86B5-BFF14F20E5C8}'); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE, RegPhConv + '\eSpeak', 'PhoneMap','- 0001'); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language',''); | |||||
end; | |||||
if RegQueryStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', sLangs) then | |||||
begin | |||||
done := RegWriteStringValue(HKEY_LOCAL_MACHINE, s1, 'Language', Lcode + ';' + sLangs); | |||||
end; | |||||
end; | |||||
end; | |||||
end; | |||||
procedure SetupVoice(Voice, Lcode: String; Index: Integer); | |||||
var | |||||
RegVoice2: String; | |||||
RegVoice2a: String; | |||||
VoiceUC: String; | |||||
begin | |||||
if Index = 0 then | |||||
RegVoice2 := RegVoice1 | |||||
else | |||||
RegVoice2 := RegVoice1 + Format('_%d',[Index]); | |||||
RegVoice2a := RegVoice2 + '\Attributes'; | |||||
if Voice = 'default' then | |||||
VoiceUC := 'default' | |||||
else | |||||
VoiceUC := Uppercase(Voice); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'',sEspeak+VoiceUC); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'CLSID','{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}'); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'Path',ExpandConstant('{app}')); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2,'VoiceName',Voice); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Name',sEspeak+Voice); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Gender','Male'); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Age','Adult'); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Language',Lcode); | |||||
RegWriteStringValue(HKEY_LOCAL_MACHINE,RegVoice2a,'Vendor','Jonathan Duddington'); | |||||
SetPhoneConvertor(Lcode); | |||||
end; | |||||
procedure CurStepChanged(CurStep: TSetupStep); | |||||
var | |||||
ix: Integer; | |||||
begin | |||||
if CurStep = ssPostInstall then | |||||
begin | |||||
for ix := 0 to 5 do begin | |||||
if Page.Values[ix] <> '' then | |||||
SetUpVoice(Page.Values[ix],LanguageFromVoice(Page.Values[ix]),ix); | |||||
end; | |||||
end; | |||||
end; | |||||
procedure InitializeWizard; | |||||
var | |||||
lang: String; | |||||
begin | |||||
// Create the language selection page | |||||
lang := ActiveLanguage; | |||||
Page := CreateInputQueryPage(wpSelectDir, | |||||
'Select which voices to install', 'or press Enter to accept defaults', | |||||
'Enter voice names, eg: (for Portuguese) pt, or with a variant, eg: pt+13'); | |||||
// Add items (False means it's not a password edit) | |||||
Page.Add('', False); | |||||
Page.Add('', False); | |||||
Page.Add('', False); | |||||
Page.Add('', False); | |||||
Page.Add('', False); | |||||
Page.Add('', False); | |||||
UILanguage := GetUILanguage; | |||||
UIVoice := VoiceFromLanguage(UILanguage); | |||||
// Set initial values (optional) | |||||
Page.Values[0] := 'en'; | |||||
Page.Values[1] := UIVoice; | |||||
Page.Values[2] := 'en-r'; | |||||
end; | |||||
[Setup] | |||||
AppName=eSpeakEdit | |||||
AppVerName=eSpeakEdit version 1.26 | |||||
DefaultDirName={pf}\eSpeak | |||||
DefaultGroupName=eSpeak | |||||
OutputBaseFilename=setup_espeakedit | |||||
Compression=lzma | |||||
SolidCompression=yes | |||||
DirExistsWarning=no | |||||
[Files] | |||||
Source: "espeakedit.exe"; DestDir: "{app}" | |||||
Source: "dictsource\*"; DestDir: "{app}\dictsource"; Flags: recursesubdirs | |||||
Source: "espeakedit\*"; DestDir: "{app}\espeakedit"; Flags: recursesubdirs | |||||
Source: "phsource\*"; DestDir: "{app}\phsource"; Flags: recursesubdirs | |||||
Source: "docs\*"; DestDir: "{app}\docs"; Flags: recursesubdirs | |||||
;Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme | |||||
======================================================================== | |||||
CONSOLE APPLICATION : espeak | |||||
======================================================================== | |||||
This is a Virtual C++ project to make a command-line version | |||||
of eSpeak for Windows. | |||||
Copy the source files from the Linux "src" directory into this | |||||
"src" directory, EXCEPT for speech.h. Keep the original Windows | |||||
command-line version iof speech.h. | |||||
// stdafx.cpp : source file that includes just the standard includes | |||||
// espeak.pch will be the pre-compiled header | |||||
// stdafx.obj will contain the pre-compiled type information | |||||
#include "stdafx.h" | |||||
// TODO: reference any additional headers you need in STDAFX.H | |||||
// and not in this file |
// stdafx.h : include file for standard system include files, | |||||
// or project specific include files that are used frequently, but | |||||
// are changed infrequently | |||||
// | |||||
#if !defined(AFX_STDAFX_H__6C2D1701_32D2_4335_A2C8_C6A23021ADBE__INCLUDED_) | |||||
#define AFX_STDAFX_H__6C2D1701_32D2_4335_A2C8_C6A23021ADBE__INCLUDED_ | |||||
#if _MSC_VER > 1000 | |||||
#pragma once | |||||
#endif // _MSC_VER > 1000 | |||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers | |||||
#include <stdio.h> | |||||
// TODO: reference additional headers your program requires here | |||||
//{{AFX_INSERT_LOCATION}} | |||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. | |||||
#endif // !defined(AFX_STDAFX_H__6C2D1701_32D2_4335_A2C8_C6A23021ADBE__INCLUDED_) |
# Microsoft Developer Studio Project File - Name="espeak" - Package Owner=<4> | |||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 | |||||
# ** DO NOT EDIT ** | |||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103 | |||||
CFG=espeak - Win32 Debug | |||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, | |||||
!MESSAGE use the Export Makefile command and run | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "espeak.mak". | |||||
!MESSAGE | |||||
!MESSAGE You can specify a configuration when running NMAKE | |||||
!MESSAGE by defining the macro CFG on the command line. For example: | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "espeak.mak" CFG="espeak - Win32 Debug" | |||||
!MESSAGE | |||||
!MESSAGE Possible choices for configuration are: | |||||
!MESSAGE | |||||
!MESSAGE "espeak - Win32 Release" (based on "Win32 (x86) Console Application") | |||||
!MESSAGE "espeak - Win32 Debug" (based on "Win32 (x86) Console Application") | |||||
!MESSAGE | |||||
# Begin Project | |||||
# PROP AllowPerConfigDependencies 0 | |||||
# PROP Scc_ProjName "" | |||||
# PROP Scc_LocalPath "" | |||||
CPP=cl.exe | |||||
RSC=rc.exe | |||||
!IF "$(CFG)" == "espeak - Win32 Release" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 0 | |||||
# PROP BASE Output_Dir "Release" | |||||
# PROP BASE Intermediate_Dir "Release" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 0 | |||||
# PROP Output_Dir "Release" | |||||
# PROP Intermediate_Dir "Release" | |||||
# PROP Ignore_Export_Lib 0 | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c | |||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c | |||||
# ADD BASE RSC /l 0x809 /d "NDEBUG" | |||||
# ADD RSC /l 0x809 /d "NDEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 | |||||
# ADD LINK32 kernel32.lib winmm.lib user32.lib gdi32.lib winspool.lib comdlg32.lib PAStaticWMME.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"espeak.exe" | |||||
!ELSEIF "$(CFG)" == "espeak - Win32 Debug" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 1 | |||||
# PROP BASE Output_Dir "Debug" | |||||
# PROP BASE Intermediate_Dir "Debug" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 1 | |||||
# PROP Output_Dir "Debug" | |||||
# PROP Intermediate_Dir "Debug" | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD BASE RSC /l 0x809 /d "_DEBUG" | |||||
# ADD RSC /l 0x809 /d "_DEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | |||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | |||||
!ENDIF | |||||
# Begin Target | |||||
# Name "espeak - Win32 Release" | |||||
# Name "espeak - Win32 Debug" | |||||
# Begin Group "Source Files" | |||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | |||||
# Begin Source File | |||||
SOURCE=.\src\compiledict.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\dictionary.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\intonation.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\numbers.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\phonemelist.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\readclause.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\setlengths.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.cpp | |||||
# ADD CPP /Yc"stdafx.h" | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synth_mbrola.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthdata.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_english.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voices.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\wavegen.cpp | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Header Files" | |||||
# PROP Default_Filter "h;hpp;hxx;hm;inl" | |||||
# Begin Source File | |||||
SOURCE=.\src\phoneme.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\sintab.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak_lib.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speech.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voice.h | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Resource Files" | |||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | |||||
# End Group | |||||
# Begin Source File | |||||
SOURCE=.\ReadMe.txt | |||||
# End Source File | |||||
# End Target | |||||
# End Project |
Microsoft Developer Studio Workspace File, Format Version 6.00 | |||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | |||||
############################################################################### | |||||
Project: "espeak"=.\espeak.dsp - Package Owner=<4> | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<4> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
Global: | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<3> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
/*************************************************************************** | |||||
* Copyright (C) 2005,2006 by Jonathan Duddington * | |||||
* [email protected] * | |||||
* * | |||||
* This program is free software; you can redistribute it and/or modify * | |||||
* it under the terms of the GNU General Public License as published by * | |||||
* the Free Software Foundation; either version 2 of the License, or * | |||||
* (at your option) any later version. * | |||||
* * | |||||
* This program is distributed in the hope that it will be useful, * | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||||
* GNU General Public License for more details. * | |||||
* * | |||||
* You should have received a copy of the GNU General Public License * | |||||
* along with this program; if not, write to the * | |||||
* Free Software Foundation, Inc., * | |||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||||
***************************************************************************/ | |||||
// Windows command-line version of eSpeak | |||||
// conditional compilation options | |||||
#define PLATFORM_WINDOWS | |||||
#define __WIN32__ | |||||
#define NEED_WCSTOF | |||||
#define NEED_GETOPT | |||||
#define PATHSEP '\\' | |||||
#define USE_PORTAUDIO | |||||
#define ESPEAK_API | |||||
// will look for espeak_data directory here, and also in user's home directory | |||||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" | |||||
typedef unsigned short USHORT; | |||||
typedef unsigned char UCHAR; | |||||
typedef double DOUBLEX; | |||||
#define N_PEAKS 9 | |||||
#define N_MARKERS 7 | |||||
typedef struct { | |||||
const char *mnem; | |||||
int value; | |||||
} MNEM_TAB; | |||||
int LookupMnem(MNEM_TAB *table, char *string); | |||||
typedef struct { | |||||
short pkfreq; | |||||
short pkheight; | |||||
short pkwidth; | |||||
short pkright; | |||||
} peak_t; | |||||
typedef struct { | |||||
short frflags; | |||||
unsigned char length; | |||||
unsigned char rms; | |||||
short ffreq[9]; | |||||
unsigned char fheight[9]; | |||||
unsigned char fwidth[6]; // width/4 | |||||
unsigned char fright[6]; // width/4 | |||||
} frame_t; | |||||
int GetFileLength(const char *filename); | |||||
char *Alloc(int size); | |||||
void Free(void *ptr); | |||||
extern void strncpy0(char *to,const char *from, int size); | |||||
extern char path_home[]; | |||||
extern const int version_phdata; | |||||
extern const char *version_string; | |||||
// dummy stdint.h file for Windows | |||||
typedef unsigned int uint32_t; |
This is a Virtual C++ project for the Windows dll | |||||
version of eSpeak. This provides the API which is | |||||
defined in speak_lib.h, using the | |||||
AUDIO_OUTPUT_SYNCHRONOUS mode only. | |||||
This is not the sapi5 version of eSpeak. | |||||
Copy the program source files from the Linux "src" | |||||
directory into this "src" directory, EXCEPT for: | |||||
speak_lib.h | |||||
speech.h | |||||
StdAfx.h | |||||
stdint.h | |||||
Keep the Windows versions of these files. | |||||
// stdafx.cpp : source file that includes just the standard includes | |||||
// espeak.pch will be the pre-compiled header | |||||
// stdafx.obj will contain the pre-compiled type information | |||||
#include "stdafx.h" | |||||
// TODO: reference any additional headers you need in STDAFX.H | |||||
// and not in this file |
// stdafx.h : include file for standard system include files, | |||||
// or project specific include files that are used frequently, but | |||||
// are changed infrequently | |||||
// | |||||
#if !defined(AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_) | |||||
#define AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_ | |||||
#if _MSC_VER > 1000 | |||||
#pragma once | |||||
#endif // _MSC_VER > 1000 | |||||
// Insert your headers here | |||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers | |||||
#include <windows.h> | |||||
// TODO: reference additional headers your program requires here | |||||
//{{AFX_INSERT_LOCATION}} | |||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. | |||||
#endif // !defined(AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_) |
# Microsoft Developer Studio Project File - Name="espeak" - Package Owner=<4> | |||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 | |||||
# ** DO NOT EDIT ** | |||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 | |||||
CFG=espeak - Win32 Debug | |||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, | |||||
!MESSAGE use the Export Makefile command and run | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "espeak.mak". | |||||
!MESSAGE | |||||
!MESSAGE You can specify a configuration when running NMAKE | |||||
!MESSAGE by defining the macro CFG on the command line. For example: | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "espeak.mak" CFG="espeak - Win32 Debug" | |||||
!MESSAGE | |||||
!MESSAGE Possible choices for configuration are: | |||||
!MESSAGE | |||||
!MESSAGE "espeak - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") | |||||
!MESSAGE "espeak - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") | |||||
!MESSAGE | |||||
# Begin Project | |||||
# PROP AllowPerConfigDependencies 0 | |||||
# PROP Scc_ProjName "" | |||||
# PROP Scc_LocalPath "" | |||||
CPP=cl.exe | |||||
MTL=midl.exe | |||||
RSC=rc.exe | |||||
!IF "$(CFG)" == "espeak - Win32 Release" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 0 | |||||
# PROP BASE Output_Dir "Release" | |||||
# PROP BASE Intermediate_Dir "Release" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 0 | |||||
# PROP Output_Dir "Release" | |||||
# PROP Intermediate_Dir "Release" | |||||
# PROP Ignore_Export_Lib 0 | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ESPEAK_EXPORTS" /Yu"stdafx.h" /FD /c | |||||
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ESPEAK_EXPORTS" /Yu"stdafx.h" /FD /c | |||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | |||||
# ADD BASE RSC /l 0x809 /d "NDEBUG" | |||||
# ADD RSC /l 0x809 /d "NDEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | |||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Release/espeak_lib.dll" | |||||
# SUBTRACT LINK32 /pdb:none | |||||
!ELSEIF "$(CFG)" == "espeak - Win32 Debug" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 1 | |||||
# PROP BASE Output_Dir "Debug" | |||||
# PROP BASE Intermediate_Dir "Debug" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 1 | |||||
# PROP Output_Dir "Debug" | |||||
# PROP Intermediate_Dir "Debug" | |||||
# PROP Ignore_Export_Lib 0 | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ESPEAK_EXPORTS" /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ESPEAK_EXPORTS" /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | |||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | |||||
# ADD BASE RSC /l 0x809 /d "_DEBUG" | |||||
# ADD RSC /l 0x809 /d "_DEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept | |||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Debug/espeak_lib.dll" /pdbtype:sept | |||||
!ENDIF | |||||
# Begin Target | |||||
# Name "espeak - Win32 Release" | |||||
# Name "espeak - Win32 Debug" | |||||
# Begin Group "Source Files" | |||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | |||||
# Begin Source File | |||||
SOURCE=.\src\compiledict.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\dictionary.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\intonation.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\numbers.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\phonemelist.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\readclause.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\setlengths.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak_lib.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.cpp | |||||
# ADD CPP /Yc"stdafx.h" | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synth_mbrola.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthdata.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_english.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voices.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\wavegen.cpp | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Header Files" | |||||
# PROP Default_Filter "h;hpp;hxx;hm;inl" | |||||
# Begin Source File | |||||
SOURCE=.\espeak.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\phoneme.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\portaudio.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\sintab.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak_lib.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speech.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\stdint.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voice.h | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Resource Files" | |||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | |||||
# End Group | |||||
# Begin Source File | |||||
SOURCE=.\ReadMe.txt | |||||
# End Source File | |||||
# End Target | |||||
# End Project |
Microsoft Developer Studio Workspace File, Format Version 6.00 | |||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | |||||
############################################################################### | |||||
Project: "espeak"=.\espeak.dsp - Package Owner=<4> | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<4> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
Global: | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<3> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
// stdafx.h : include file for standard system include files, | |||||
// or project specific include files that are used frequently, but | |||||
// are changed infrequently | |||||
// | |||||
#if !defined(AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_) | |||||
#define AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_ | |||||
#if _MSC_VER > 1000 | |||||
#pragma once | |||||
#endif // _MSC_VER > 1000 | |||||
// Insert your headers here | |||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers | |||||
#include <windows.h> | |||||
// TODO: reference additional headers your program requires here | |||||
//{{AFX_INSERT_LOCATION}} | |||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. | |||||
#endif // !defined(AFX_STDAFX_H__55502A81_7778_46B7_B400_FD19199C842B__INCLUDED_) |
#ifndef SPEAK_LIB_H | |||||
#define SPEAK_LIB_H | |||||
/*************************************************************************** | |||||
* Copyright (C) 2006 by Jonathan Duddington * | |||||
* [email protected] * | |||||
* * | |||||
* This program is free software; you can redistribute it and/or modify * | |||||
* it under the terms of the GNU General Public License as published by * | |||||
* the Free Software Foundation; either version 2 of the License, or * | |||||
* (at your option) any later version. * | |||||
* * | |||||
* This program is distributed in the hope that it will be useful, * | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||||
* GNU General Public License for more details. * | |||||
* * | |||||
* You should have received a copy of the GNU General Public License * | |||||
* along with this program; if not, write to the * | |||||
* Free Software Foundation, Inc., * | |||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||||
***************************************************************************/ | |||||
/*************************************************************/ | |||||
/* This is the header file for the library version of espeak */ | |||||
/* */ | |||||
/*************************************************************/ | |||||
#define ESPEAK_API __declspec(dllexport) | |||||
#include <stdio.h> | |||||
/********************/ | |||||
/* Initialization */ | |||||
/********************/ | |||||
typedef enum { | |||||
espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list. | |||||
espeakEVENT_WORD = 1, // Start of word | |||||
espeakEVENT_SENTENCE, // Start of sentence | |||||
espeakEVENT_MARK, // Mark | |||||
espeakEVENT_PLAY, // Audio element | |||||
espeakEVENT_END, // End of sentence | |||||
espeakEVENT_MSG_TERMINATED, // End of message | |||||
espeakEVENT_PHONEME // Phoneme, if enabled in espeak_Initialize() | |||||
} espeak_EVENT_TYPE; | |||||
typedef struct { | |||||
espeak_EVENT_TYPE type; | |||||
unsigned int unique_identifier; // message identifier (or 0 for key or character) | |||||
int text_position; // the number of characters from the start of the text | |||||
int length; // word length, in characters (for espeakEVENT_WORD) | |||||
int audio_position; // the time in mS within the generated speech output data | |||||
int sample; // sample id (internal use) | |||||
void* user_data; // pointer supplied by the calling program | |||||
union { | |||||
int number; // used for WORD and SENTENCE events. For PHONEME events this is the phoneme mnemonic. | |||||
const char *name; // used for MARK and PLAY events. UTF8 string | |||||
} id; | |||||
} espeak_EVENT; | |||||
/* | |||||
When a message is supplied to espeak_synth, the request is buffered and espeak_synth returns. When the message is really processed, the callback function will be repetedly called. | |||||
In RETRIEVAL mode, the callback function supplies to the calling program the audio data and an event list terminated by 0 (LIST_TERMINATED). | |||||
In PLAYBACK mode, the callback function is called as soon as an event happens. | |||||
For example suppose that the following message is supplied to espeak_Synth: | |||||
"hello, hello." | |||||
* Once processed in RETRIEVAL mode, it could lead to 3 calls of the callback function : | |||||
** Block 1: | |||||
<audio data> + | |||||
List of events: SENTENCE + WORD + LIST_TERMINATED | |||||
** Block 2: | |||||
<audio data> + | |||||
List of events: WORD + END + LIST_TERMINATED | |||||
** Block 3: | |||||
no audio data | |||||
List of events: MSG_TERMINATED + LIST_TERMINATED | |||||
* Once processed in PLAYBACK mode, it could lead to 5 calls of the callback function: | |||||
** SENTENCE | |||||
** WORD (call when the sounds are actually played) | |||||
** WORD | |||||
** END (call when the end of sentence is actually played.) | |||||
** MSG_TERMINATED | |||||
The MSG_TERMINATED event is the last event. It can inform the calling program to clear the user data related to the message. | |||||
So if the synthesis must be stopped, the callback function is called for each pending message with the MSG_TERMINATED event. | |||||
A MARK event indicates a <mark> element in the text. | |||||
A PLAY event indicates an <audio> element in the text, for which the calling program should play the named sound file. | |||||
*/ | |||||
typedef enum { | |||||
POS_CHARACTER = 1, | |||||
POS_WORD, | |||||
POS_SENTENCE | |||||
} espeak_POSITION_TYPE; | |||||
typedef enum { | |||||
/* PLAYBACK mode: plays the audio data, supplies events to the calling program*/ | |||||
AUDIO_OUTPUT_PLAYBACK, | |||||
/* RETRIEVAL mode: supplies audio data and events to the calling program */ | |||||
AUDIO_OUTPUT_RETRIEVAL, | |||||
/* SYNCHRONOUS mode: as RETRIEVAL but doesn't return until synthesis is completed */ | |||||
AUDIO_OUTPUT_SYNCHRONOUS, | |||||
/* Synchronous playback */ | |||||
AUDIO_OUTPUT_SYNCH_PLAYBACK | |||||
} espeak_AUDIO_OUTPUT; | |||||
typedef enum { | |||||
EE_OK=0, | |||||
EE_INTERNAL_ERROR=-1, | |||||
EE_BUFFER_FULL=1, | |||||
EE_NOT_FOUND=2 | |||||
} espeak_ERROR; | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options); | |||||
/* Must be called before any synthesis functions are called. | |||||
output: the audio data can either be played by eSpeak or passed back by the SynthCallback function. | |||||
buflength: The length in mS of sound buffers passed to the SynthCallback function. | |||||
path: The directory which contains the espeak-data directory, or NULL for the default location. | |||||
options: bit 0: 1=allow espeakEVENT_PHONEME events. | |||||
Returns: sample rate in Hz, or -1 (EE_INTERNAL_ERROR). | |||||
*/ | |||||
typedef int (t_espeak_callback)(short*, int, espeak_EVENT*); | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
void espeak_SetSynthCallback(t_espeak_callback* SynthCallback); | |||||
/* Must be called before any synthesis functions are called. | |||||
This specifies a function in the calling program which is called when a buffer of | |||||
speech sound data has been produced. | |||||
The callback function is of the form: | |||||
int SynthCallback(short *wav, int numsamples, espeak_EVENT *events); | |||||
wav: is the speech sound data which has been produced. | |||||
NULL indicates that the synthesis has been completed. | |||||
numsamples: is the number of entries in wav. This number may vary, may be less than | |||||
the value implied by the buflength parameter given in espeak_Initialize, and may | |||||
sometimes be zero (which does NOT indicate end of synthesis). | |||||
events: an array of espeak_EVENT items which indicate word and sentence events, and | |||||
also the occurance if <mark> and <audio> elements within the text. | |||||
Callback returns: 0=continue synthesis, 1=abort synthesis. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
void espeak_SetUriCallback(int (*UriCallback)(int, const char*, const char*)); | |||||
/* This function must be called before synthesis functions are used, in order to deal with | |||||
<audio> tags. It specifies a callback function which is called when an <audio> element is | |||||
encountered and allows the calling program to indicate whether the sound file which | |||||
is specified in the <audio> element is available and is to be played. | |||||
The callback function is of the form: | |||||
int UriCallback(int type, const char *uri, const char *base); | |||||
type: type of callback event. Currently only 1= <audio> element | |||||
uri: the "src" attribute from the <audio> element | |||||
base: the "xml:base" attribute (if any) from the <speak> element | |||||
Return: 1=don't play the sound, but speak the text alternative. | |||||
0=place a PLAY event in the event list at the point where the <audio> element | |||||
occurs. The calling program can then play the sound at that point. | |||||
*/ | |||||
/********************/ | |||||
/* Synthesis */ | |||||
/********************/ | |||||
#define espeakCHARS_AUTO 0 | |||||
#define espeakCHARS_UTF8 1 | |||||
#define espeakCHARS_8BIT 2 | |||||
#define espeakCHARS_WCHAR 3 | |||||
#define espeakSSML 0x10 | |||||
#define espeakPHONEMES 0x100 | |||||
#define espeakENDPAUSE 0x1000 | |||||
#define espeakKEEP_NAMEDATA 0x2000 | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Synth(const void *text, | |||||
size_t size, | |||||
unsigned int position, | |||||
espeak_POSITION_TYPE position_type, | |||||
unsigned int end_position, | |||||
unsigned int flags, | |||||
unsigned int* unique_identifier, | |||||
void* user_data); | |||||
/* Synthesize speech for the specified text. The speech sound data is passed to the calling | |||||
program in buffers by means of the callback function specified by espeak_SetSynthCallback(). The command is asynchronous: it is internally buffered and returns as soon as possible. If espeak_Initialize was previously called with AUDIO_OUTPUT_PLAYBACK as argument, the sound data are played by eSpeak. | |||||
text: The text to be spoken, terminated by a zero character. It may be either 8-bit characters, | |||||
wide characters (wchar_t), or UTF8 encoding. Which of these is determined by the "flags" | |||||
parameter. | |||||
size: Equal to (or greatrer than) the size of the text data, in bytes. This is used in order | |||||
to allocate internal storage space for the text. This value is not used for | |||||
AUDIO_OUTPUT_SYNCHRONOUS mode. | |||||
position: The position in the text where speaking starts. Zero indicates speak from the | |||||
start of the text. | |||||
position_type: Determines whether "position" is a number of characters, words, or sentences. | |||||
Values: | |||||
end_position: If set, this gives a character position at which speaking will stop. A value | |||||
of zero indicates no end position. | |||||
flags: These may be OR'd together: | |||||
Type of character codes, one of: | |||||
espeakCHARS_UTF8 UTF8 encoding | |||||
espeakCHARS_8BIT The 8 bit ISO-8859 character set for the particular language. | |||||
espeakCHARS_AUTO 8 bit or UTF8 (this is the default) | |||||
espeakCHARS_WCHAR Wide characters (wchar_t) | |||||
espeakSSML Elements within < > are treated as SSML elements, or if not recognised are ignored. | |||||
espeakPHONEMES Text within [[ ]] is treated as phonemes codes (in espeak's Hirschenbaum encoding). | |||||
espeakENDPAUSE If set then a sentence pause is added at the end of the text. If not set then | |||||
this pause is suppressed. | |||||
unique_identifier: message identifier; helpful for identifying later | |||||
data supplied to the callback. | |||||
user_data: pointer which will be passed to the callback function. | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Synth_Mark(const void *text, | |||||
size_t size, | |||||
const char *index_mark, | |||||
unsigned int end_position, | |||||
unsigned int flags, | |||||
unsigned int* unique_identifier, | |||||
void* user_data); | |||||
/* Synthesize speech for the specified text. Similar to espeak_Synth() but the start position is | |||||
specified by the name of a <mark> element in the text. | |||||
index_mark: The "name" attribute of a <mark> element within the text which specified the | |||||
point at which synthesis starts. UTF8 string. | |||||
For the other parameters, see espeak_Synth() | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Key(const char *key_name); | |||||
/* Speak the name of a keyboard key. | |||||
Currently this just speaks the "key_name" as given | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Char(wchar_t character); | |||||
/* Speak the name of the given character | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
/* Note, there is no function to play a sound icon. This would be done by the calling program */ | |||||
/***********************/ | |||||
/* Speech Parameters */ | |||||
/***********************/ | |||||
typedef enum { | |||||
espeakSILENCE=0, /* internal use */ | |||||
espeakRATE, | |||||
espeakVOLUME, | |||||
espeakPITCH, | |||||
espeakRANGE, | |||||
espeakPUNCTUATION, | |||||
espeakCAPITALS, | |||||
espeakEMPHASIS, /* internal use */ | |||||
espeakLINELENGTH, /* internal use */ | |||||
espeakVOICETYPE, // internal, 1=mbrola | |||||
N_SPEECH_PARAM /* last enum */ | |||||
} espeak_PARAMETER; | |||||
typedef enum { | |||||
espeakPUNCT_NONE=0, | |||||
espeakPUNCT_ALL=1, | |||||
espeakPUNCT_SOME=2 | |||||
} espeak_PUNCT_TYPE; | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative); | |||||
/* Sets the value of the specified parameter. | |||||
relative=0 Sets the absolute value of the parameter. | |||||
relative=1 Sets a relative value of the parameter. | |||||
parameter: | |||||
espeakRATE: speaking speed in word per minute. | |||||
espeakVOLUME: volume in range 0-100 0=silence | |||||
espeakPITCH: base pitch, range 0-100. 50=normal | |||||
espeakRANGE: pitch range, range 0-100. 0-monotone, 50=normal | |||||
espeakPUNCTUATION: which punctuation characters to announce: | |||||
value in espeak_PUNCT_TYPE (none, all, some), | |||||
see espeak_GetParameter() to specify which characters are announced. | |||||
espeakCAPITALS: announce capital letters by: | |||||
0=none, | |||||
1=sound icon, | |||||
2=spelling, | |||||
3 or higher, by raising pitch. This values gives the amount in Hz by which the pitch | |||||
of a word raised to indicate it has a capital letter. | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
int espeak_GetParameter(espeak_PARAMETER parameter, int current); | |||||
/* current=0 Returns the default value of the specified parameter. | |||||
current=1 Returns the current value of the specified parameter, as set by SetParameter() | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist); | |||||
/* Specified a list of punctuation characters whose names are to be spoken when the | |||||
value of the Punctuation parameter is set to "some". | |||||
punctlist: A list of character codes, terminated by a zero character. | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
void espeak_SetPhonemeTrace(int value, FILE *stream); | |||||
/* Controls the output of phoneme symbols for the text | |||||
value=0 No phoneme output (default) | |||||
value=1 Output the translated phoneme symbols for the text | |||||
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries) | |||||
stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
void espeak_CompileDictionary(const char *path, FILE *log); | |||||
/* Compile pronunciation dictionary for a language which corresponds to the currently | |||||
selected voice. The required voice should be selected before calling this function. | |||||
path: The directory which contains the language's '_rules' and '_list' files. | |||||
'path' should end with a path separator character ('/'). | |||||
log: Stream for error reports and statistics information. If log=NULL then stderr will be used. | |||||
*/ | |||||
/***********************/ | |||||
/* Voice Selection */ | |||||
/***********************/ | |||||
// voice table | |||||
typedef struct { | |||||
char *name; // a given name for this voice. UTF8 string. | |||||
char *languages; // list of pairs of (byte) priority + (string) language (and dialect qualifier) | |||||
char *identifier; // the filename for this voice within espeak-data/voices | |||||
unsigned char gender; // 0=none 1=male, 2=female, | |||||
unsigned char age; // 0=not specified, or age in years | |||||
unsigned char variant; // only used when passed as a parameter to espeak_SetVoiceByProperties | |||||
unsigned char xx1; // for internal use | |||||
int score; // for internal use | |||||
void *spare; // for internal use | |||||
} espeak_VOICE; | |||||
/* Note: The espeak_VOICE structure is used for two purposes: | |||||
1. To return the details of the available voices. | |||||
2. As a parameter to espeak_SetVoiceByProperties() in order to specify selection criteria. | |||||
In (1), the "languages" field consists of a list of (UTF8) language names for which this voice | |||||
may be used, each language name in the list is terminated by a zero byte and is also preceded by | |||||
a single byte which gives a "priority" number. The list of languages is terminated by an | |||||
additional zero byte. | |||||
A language name consists of a language code, optionally followed by one or more qualifier (dialect) | |||||
names separated by hyphens (eg. "en-uk"). A voice might, for example, have languages "en-uk" and | |||||
"en". Even without "en" listed, voice would still be selected for the "en" language (because | |||||
"en-uk" is related) but at a lower priority. | |||||
The priority byte indicates how the voice is preferred for the language. A low number indicates a | |||||
more preferred voice, a higher number indicates a less preferred voice. | |||||
In (2), the "languages" field consists simply of a single (UTF8) language name, with no preceding | |||||
priority byte. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec); | |||||
/* Reads the voice files from espeak-data/voices and creates an array of espeak_VOICE pointers. | |||||
The list is terminated by a NULL pointer | |||||
If voice_spec is NULL then all voices are listed. | |||||
If voice spec is give, then only the voices which are compatible with the voice_spec | |||||
are listed, and they are listed in preference order. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_SetVoiceByName(const char *name); | |||||
/* Searches for a voice with a matching "name" field. Language is not considered. | |||||
"name" is a UTF8 string. | |||||
Return: EE_OK: operation achieved | |||||
EE_BUFFER_FULL: the command can not be buffered; | |||||
you may try after a while to call the function again. | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_SetVoiceByProperties(espeak_VOICE *voice_spec); | |||||
/* An espeak_VOICE structure is used to pass criteria to select a voice. Any of the following | |||||
fields may be set: | |||||
name NULL, or a voice name | |||||
languages NULL, or a single language string (with optional dialect), eg. "en-uk", or "en" | |||||
gender 0=not specified, 1=male, 2=female | |||||
age 0=not specified, or an age in years | |||||
variant After a list of candidates is produced, scored and sorted, "variant" is used to index | |||||
that list and choose a voice. | |||||
variant=0 takes the top voice (i.e. best match). variant=1 takes the next voice, etc | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_VOICE *espeak_GetCurrentVoice(void); | |||||
/* Returns the espeak_VOICE data for the currently selected voice. | |||||
This is not affected by temporary voice changes caused by SSML elements such as <voice> and <s> | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Cancel(void); | |||||
/* Stop immediately synthesis and audio output of the current text. When this | |||||
function returns, the audio output is fully stopped and the synthesizer is ready to | |||||
synthesize a new message. | |||||
Return: EE_OK: operation achieved | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
int espeak_IsPlaying(void); | |||||
/* Returns 1 if audio is played, 0 otherwise. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Synchronize(void); | |||||
/* This function returns when all data have been spoken. | |||||
Return: EE_OK: operation achieved | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
espeak_ERROR espeak_Terminate(void); | |||||
/* last function to be called. | |||||
Return: EE_OK: operation achieved | |||||
EE_INTERNAL_ERROR. | |||||
*/ | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
#endif | |||||
const char *espeak_Info(void* ptr); | |||||
/* Returns the version number string. | |||||
The parameter is for future use, and should be set to NULL | |||||
*/ | |||||
#endif |
/*************************************************************************** | |||||
* Copyright (C) 2005,2006 by Jonathan Duddington * | |||||
* [email protected] * | |||||
* * | |||||
* This program is free software; you can redistribute it and/or modify * | |||||
* it under the terms of the GNU General Public License as published by * | |||||
* the Free Software Foundation; either version 2 of the License, or * | |||||
* (at your option) any later version. * | |||||
* * | |||||
* This program is distributed in the hope that it will be useful, * | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||||
* GNU General Public License for more details. * | |||||
* * | |||||
* You should have received a copy of the GNU General Public License * | |||||
* along with this program; if not, write to the * | |||||
* Free Software Foundation, Inc., * | |||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||||
***************************************************************************/ | |||||
// Windows command-line version of eSpeak | |||||
// conditional compilation options | |||||
#define PLATFORM_WINDOWS | |||||
#define __WIN32__ | |||||
#define NEED_WCSTOF | |||||
#define NEED_GETOPT | |||||
#define PATHSEP '\\' | |||||
// #define USE_PORTAUDIO | |||||
#define ESPEAK_API __declspec(dllexport) | |||||
#define LIBRARY | |||||
// will look for espeak_data directory here, and also in user's home directory | |||||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" | |||||
typedef unsigned short USHORT; | |||||
typedef unsigned char UCHAR; | |||||
typedef double DOUBLEX; | |||||
#define N_PEAKS 9 | |||||
#define N_MARKERS 7 | |||||
typedef struct { | |||||
const char *mnem; | |||||
int value; | |||||
} MNEM_TAB; | |||||
int LookupMnem(MNEM_TAB *table, char *string); | |||||
typedef struct { | |||||
short pkfreq; | |||||
short pkheight; | |||||
short pkwidth; | |||||
short pkright; | |||||
} peak_t; | |||||
typedef struct { | |||||
short frflags; | |||||
unsigned char length; | |||||
unsigned char rms; | |||||
short ffreq[9]; | |||||
unsigned char fheight[9]; | |||||
unsigned char fwidth[6]; // width/4 | |||||
unsigned char fright[6]; // width/4 | |||||
} frame_t; | |||||
int GetFileLength(const char *filename); | |||||
char *Alloc(int size); | |||||
void Free(void *ptr); | |||||
extern void strncpy0(char *to,const char *from, int size); | |||||
extern char path_home[]; | |||||
extern const int version_phdata; | |||||
extern const char *version_string; | |||||
// dummy stdint.h file for Windows | |||||
typedef unsigned int uint32_t; |
This is a Virtual C++ project for the Windows SAPI5 | |||||
version of eSpeak. | |||||
Copy the program source files from the Linux "src" | |||||
directory into this "src" directory, EXCEPT for: | |||||
speech.h | |||||
StdAfx.h | |||||
stdint.h | |||||
Keep the Windows versions of these files. | |||||
/* this ALWAYS GENERATED file contains the definitions for the interfaces */ | |||||
/* File created by MIDL compiler version 5.01.0164 */ | |||||
/* at Sat Dec 16 21:19:27 2006 | |||||
*/ | |||||
/* Compiler settings for C:\Program Files\Microsoft Speech SDK 5.1\Samples\CPP\Engines\TTS\TtsEng.idl: | |||||
Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext | |||||
error checks: allocation ref bounds_check enum stub_data | |||||
*/ | |||||
//@@MIDL_FILE_HEADING( ) | |||||
/* verify that the <rpcndr.h> version is high enough to compile this file*/ | |||||
#ifndef __REQUIRED_RPCNDR_H_VERSION__ | |||||
#define __REQUIRED_RPCNDR_H_VERSION__ 440 | |||||
#endif | |||||
#include "rpc.h" | |||||
#include "rpcndr.h" | |||||
#ifndef __TtsEng_h__ | |||||
#define __TtsEng_h__ | |||||
#ifdef __cplusplus | |||||
extern "C"{ | |||||
#endif | |||||
/* Forward Declarations */ | |||||
#ifndef __SampleTTSEngine_FWD_DEFINED__ | |||||
#define __SampleTTSEngine_FWD_DEFINED__ | |||||
#ifdef __cplusplus | |||||
typedef class SampleTTSEngine SampleTTSEngine; | |||||
#else | |||||
typedef struct SampleTTSEngine SampleTTSEngine; | |||||
#endif /* __cplusplus */ | |||||
#endif /* __SampleTTSEngine_FWD_DEFINED__ */ | |||||
/* header files for imported files */ | |||||
#include "oaidl.h" | |||||
#include "ocidl.h" | |||||
#include "sapiddk.h" | |||||
void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); | |||||
void __RPC_USER MIDL_user_free( void __RPC_FAR * ); | |||||
/* interface __MIDL_itf_TtsEng_0000 */ | |||||
/* [local] */ | |||||
typedef struct VOICEITEM | |||||
{ | |||||
LPCWSTR pText; | |||||
ULONG ulTextLen; | |||||
ULONG ulNumAudioBytes; | |||||
BYTE __RPC_FAR *pAudio; | |||||
} VOICEITEM; | |||||
extern RPC_IF_HANDLE __MIDL_itf_TtsEng_0000_v0_0_c_ifspec; | |||||
extern RPC_IF_HANDLE __MIDL_itf_TtsEng_0000_v0_0_s_ifspec; | |||||
#ifndef __SAMPLETTSENGLib_LIBRARY_DEFINED__ | |||||
#define __SAMPLETTSENGLib_LIBRARY_DEFINED__ | |||||
/* library SAMPLETTSENGLib */ | |||||
/* [helpstring][version][uuid] */ | |||||
EXTERN_C const IID LIBID_SAMPLETTSENGLib; | |||||
EXTERN_C const CLSID CLSID_SampleTTSEngine; | |||||
#ifdef __cplusplus | |||||
class DECLSPEC_UUID("BE985C8D-BE32-4A22-AA93-55C16A6D1D91") | |||||
SampleTTSEngine; | |||||
#endif | |||||
#endif /* __SAMPLETTSENGLib_LIBRARY_DEFINED__ */ | |||||
/* Additional Prototypes for ALL interfaces */ | |||||
/* end of Additional Prototypes */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif |
/* this file contains the actual definitions of */ | |||||
/* the IIDs and CLSIDs */ | |||||
/* link this file in with the server and any clients */ | |||||
/* File created by MIDL compiler version 5.01.0164 */ | |||||
/* at Sat Dec 16 21:19:27 2006 | |||||
*/ | |||||
/* Compiler settings for C:\Program Files\Microsoft Speech SDK 5.1\Samples\CPP\Engines\TTS\TtsEng.idl: | |||||
Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext | |||||
error checks: allocation ref bounds_check enum stub_data | |||||
*/ | |||||
//@@MIDL_FILE_HEADING( ) | |||||
#ifdef __cplusplus | |||||
extern "C"{ | |||||
#endif | |||||
#ifndef __IID_DEFINED__ | |||||
#define __IID_DEFINED__ | |||||
typedef struct _IID | |||||
{ | |||||
unsigned long x; | |||||
unsigned short s1; | |||||
unsigned short s2; | |||||
unsigned char c[8]; | |||||
} IID; | |||||
#endif // __IID_DEFINED__ | |||||
#ifndef CLSID_DEFINED | |||||
#define CLSID_DEFINED | |||||
typedef IID CLSID; | |||||
#endif // CLSID_DEFINED | |||||
const IID LIBID_SAMPLETTSENGLib = {0x7192AA2F,0xF759,0x43e9,{0x91,0xE7,0x22,0x63,0x71,0xEF,0x6B,0x2F}}; | |||||
const CLSID CLSID_SampleTTSEngine = {0xBE985C8D,0xBE32,0x4A22,{0xAA,0x93,0x55,0xC1,0x6A,0x6D,0x1D,0x91}}; | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
//{{NO_DEPENDENCIES}} | |||||
// Microsoft Developer Studio generated include file. | |||||
// Used by TtsEng.rc | |||||
// | |||||
#define IDS_PROJNAME 100 | |||||
#define IDR_SAMPLETTSENGINE 101 | |||||
#define IDR_SAMPLEVOICEDATAOBJ 102 | |||||
// Next default values for new objects | |||||
// | |||||
#ifdef APSTUDIO_INVOKED | |||||
#ifndef APSTUDIO_READONLY_SYMBOLS | |||||
#define _APS_NEXT_RESOURCE_VALUE 201 | |||||
#define _APS_NEXT_COMMAND_VALUE 32768 | |||||
#define _APS_NEXT_CONTROL_VALUE 201 | |||||
#define _APS_NEXT_SYMED_VALUE 103 | |||||
#endif | |||||
#endif |
// This is a dummy file. | |||||
// A file of this name is needed on Windows | |||||
/*************************************************************************** | |||||
* Copyright (C) 2005,2006 by Jonathan Duddington * | |||||
* [email protected] * | |||||
* * | |||||
* This program is free software; you can redistribute it and/or modify * | |||||
* it under the terms of the GNU General Public License as published by * | |||||
* the Free Software Foundation; either version 2 of the License, or * | |||||
* (at your option) any later version. * | |||||
* * | |||||
* This program is distributed in the hope that it will be useful, * | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||||
* GNU General Public License for more details. * | |||||
* * | |||||
* You should have received a copy of the GNU General Public License * | |||||
* along with this program; if not, write to the * | |||||
* Free Software Foundation, Inc., * | |||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||||
***************************************************************************/ | |||||
// speech.h file for the Windows SAPI5 version of eSpeak | |||||
// conditional compilation options | |||||
#define PLATFORM_WINDOWS | |||||
#define __WIN32__ | |||||
#define NEED_WCSTOF | |||||
#define NEED_GETOPT | |||||
#define USE_MBROLA_LIB | |||||
#define ESPEAK_API | |||||
#define PATHSEP '\\' | |||||
//#define PLATFORM_POSIX | |||||
//#define __cdecl // define as null, needed for Borland compiler ? | |||||
//#define USE_PORTAUDIO | |||||
//#define USE_NANOSLEEP | |||||
// will look for espeak_data directory here, and also in user's home directory | |||||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" | |||||
typedef unsigned short USHORT; | |||||
typedef unsigned char UCHAR; | |||||
typedef double DOUBLEX; | |||||
#define N_PEAKS 9 | |||||
#define N_MARKERS 7 | |||||
typedef struct { | |||||
const char *mnem; | |||||
int value; | |||||
} MNEM_TAB; | |||||
int LookupMnem(MNEM_TAB *table, char *string); | |||||
typedef struct { | |||||
short pkfreq; | |||||
short pkheight; | |||||
short pkwidth; | |||||
short pkright; | |||||
} peak_t; | |||||
typedef struct { | |||||
short frflags; | |||||
unsigned char length; | |||||
unsigned char rms; | |||||
short ffreq[9]; | |||||
unsigned char fheight[9]; | |||||
unsigned char fwidth[6]; // width/4 | |||||
unsigned char fright[6]; // width/4 | |||||
} frame_t; | |||||
int GetFileLength(const char *filename); | |||||
char *Alloc(int size); | |||||
void Free(void *ptr); | |||||
extern void strncpy0(char *to,const char *from, int size); | |||||
extern char path_home[]; | |||||
extern const int version_phdata; | |||||
extern const char *version_string; | |||||
// dummy stdint.h file for Windows | |||||
typedef unsigned int uint32_t; |
// stdafx.cpp : source file that includes just the standard includes | |||||
// stdafx.pch will be the pre-compiled header | |||||
// stdafx.obj will contain the pre-compiled type information | |||||
//Copyright (c) Microsoft Corporation. All rights reserved. | |||||
#include "stdafx.h" | |||||
#ifdef _ATL_STATIC_REGISTRY | |||||
#include <statreg.h> | |||||
#include <statreg.cpp> | |||||
#endif | |||||
#include <atlimpl.cpp> | |||||
// stdafx.h : include file for standard system include files, | |||||
// or project specific include files that are used frequently, | |||||
// but are changed infrequently | |||||
#if !defined(AFX_STDAFX_H__3F7C4D2C_D007_11D2_B503_00C04F797396__INCLUDED_) | |||||
#define AFX_STDAFX_H__3F7C4D2C_D007_11D2_B503_00C04F797396__INCLUDED_ | |||||
#if _MSC_VER > 1000 | |||||
#pragma once | |||||
#endif // _MSC_VER > 1000 | |||||
#ifndef STRICT | |||||
#define STRICT | |||||
#endif | |||||
#ifndef _WIN32_WINNT | |||||
#define _WIN32_WINNT 0x0400 | |||||
#endif | |||||
#include <atlbase.h> | |||||
//You may derive a class from CComModule and use it if you want to override | |||||
//something, but do not change the name of _Module | |||||
extern CComModule _Module; | |||||
#include <atlcom.h> | |||||
//{{AFX_INSERT_LOCATION}} | |||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. | |||||
#endif // !defined(AFX_STDAFX_H__3F7C4D2C_D007_11D2_B503_00C04F797396__INCLUDED) | |||||
// TtsEng.cpp : Implementation of DLL Exports. | |||||
//Copyright (c) Microsoft Corporation. All rights reserved. | |||||
// Note: Proxy/Stub Information | |||||
// To build a separate proxy/stub DLL, | |||||
// run nmake -f msttsdrvps.mk in the project directory. | |||||
#include "stdafx.h" | |||||
#include "resource.h" | |||||
#include <initguid.h> | |||||
#include "TtsEng.h" | |||||
#include "TtsEng_i.c" | |||||
#include "TtsEngObj.h" | |||||
CComModule _Module; | |||||
BEGIN_OBJECT_MAP(ObjectMap) | |||||
OBJECT_ENTRY( CLSID_SampleTTSEngine , CTTSEngObj ) | |||||
END_OBJECT_MAP() | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// DLL Entry Point | |||||
#ifdef _WIN32_WCE | |||||
extern "C" BOOL WINAPI DllMain(HANDLE hInstance, ULONG dwReason, LPVOID) | |||||
#else | |||||
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) | |||||
#endif | |||||
{ | |||||
if (dwReason == DLL_PROCESS_ATTACH) | |||||
{ | |||||
_Module.Init(ObjectMap, (HINSTANCE)hInstance, &LIBID_SAMPLETTSENGLib); | |||||
} | |||||
else if (dwReason == DLL_PROCESS_DETACH) | |||||
_Module.Term(); | |||||
return TRUE; // ok | |||||
} | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// Used to determine whether the DLL can be unloaded by OLE | |||||
STDAPI DllCanUnloadNow(void) | |||||
{ | |||||
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; | |||||
} | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// Returns a class factory to create an object of the requested type | |||||
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) | |||||
{ | |||||
return _Module.GetClassObject(rclsid, riid, ppv); | |||||
} | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// DllRegisterServer - Adds entries to the system registry | |||||
STDAPI DllRegisterServer(void) | |||||
{ | |||||
// registers object, typelib and all interfaces in typelib | |||||
return _Module.RegisterServer(TRUE); | |||||
} | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// DllUnregisterServer - Removes entries from the system registry | |||||
STDAPI DllUnregisterServer(void) | |||||
{ | |||||
return _Module.UnregisterServer(TRUE); | |||||
} | |||||
EXPORTS | |||||
DllCanUnloadNow PRIVATE | |||||
DllGetClassObject PRIVATE | |||||
DllRegisterServer PRIVATE | |||||
DllUnregisterServer PRIVATE |
# Microsoft Developer Studio Project File - Name="TtsEng" - Package Owner=<4> | |||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 | |||||
# ** DO NOT EDIT ** | |||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 | |||||
CFG=TtsEng - Win32 Debug x86 | |||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, | |||||
!MESSAGE use the Export Makefile command and run | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "ttseng.mak". | |||||
!MESSAGE | |||||
!MESSAGE You can specify a configuration when running NMAKE | |||||
!MESSAGE by defining the macro CFG on the command line. For example: | |||||
!MESSAGE | |||||
!MESSAGE NMAKE /f "ttseng.mak" CFG="TtsEng - Win32 Debug x86" | |||||
!MESSAGE | |||||
!MESSAGE Possible choices for configuration are: | |||||
!MESSAGE | |||||
!MESSAGE "TtsEng - Win32 Debug x86" (based on "Win32 (x86) Dynamic-Link Library") | |||||
!MESSAGE "TtsEng - Win32 Release x86" (based on "Win32 (x86) Dynamic-Link Library") | |||||
!MESSAGE | |||||
# Begin Project | |||||
# PROP AllowPerConfigDependencies 0 | |||||
# PROP Scc_ProjName "" | |||||
# PROP Scc_LocalPath "Desktop" | |||||
CPP=cl.exe | |||||
MTL=midl.exe | |||||
RSC=rc.exe | |||||
!IF "$(CFG)" == "TtsEng - Win32 Debug x86" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 1 | |||||
# PROP BASE Output_Dir "TtsEng___Win32_Debug_x86" | |||||
# PROP BASE Intermediate_Dir "TtsEng___Win32_Debug_x86" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 1 | |||||
# PROP Output_Dir "Debug_x86" | |||||
# PROP Intermediate_Dir "Debug_x86" | |||||
# PROP Ignore_Export_Lib 0 | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /I "..\..\..\sdk\include" /I "..\..\..\ddk\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /I "..\..\..\..\..\ddk\include" /I "..\..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /FR /Yu"stdafx.h" /FD /GZ /c | |||||
# ADD MTL /I "..\..\..\..\..\ddk\idl" /I "..\..\..\..\idl" | |||||
# ADD BASE RSC /l 0x409 /d "_DEBUG" | |||||
# ADD RSC /l 0x409 /d "_DEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept | |||||
# ADD LINK32 kernel32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /dll /map /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\lib\i386" | |||||
# Begin Custom Build - Performing registration | |||||
OutDir=.\Debug_x86 | |||||
TargetPath=.\Debug_x86\ttseng.dll | |||||
InputPath=.\Debug_x86\ttseng.dll | |||||
SOURCE="$(InputPath)" | |||||
"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" | |||||
regsvr32 /s /c "$(TargetPath)" | |||||
echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" | |||||
# End Custom Build | |||||
!ELSEIF "$(CFG)" == "TtsEng - Win32 Release x86" | |||||
# PROP BASE Use_MFC 0 | |||||
# PROP BASE Use_Debug_Libraries 0 | |||||
# PROP BASE Output_Dir "TtsEng___Win32_Release_x86" | |||||
# PROP BASE Intermediate_Dir "TtsEng___Win32_Release_x86" | |||||
# PROP BASE Target_Dir "" | |||||
# PROP Use_MFC 0 | |||||
# PROP Use_Debug_Libraries 0 | |||||
# PROP Output_Dir "Release_x86" | |||||
# PROP Intermediate_Dir "Release_x86" | |||||
# PROP Ignore_Export_Lib 0 | |||||
# PROP Target_Dir "" | |||||
# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c | |||||
# ADD CPP /nologo /MT /W3 /O1 /I "..\..\..\..\..\ddk\include" /I "..\..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /Yu"stdafx.h" /FD /c | |||||
# ADD MTL /I "..\..\..\..\..\ddk\idl" /I "..\..\..\..\idl" | |||||
# ADD BASE RSC /l 0x409 /d "NDEBUG" | |||||
# ADD RSC /l 0x409 /d "NDEBUG" | |||||
BSC32=bscmake.exe | |||||
# ADD BASE BSC32 /nologo | |||||
# ADD BSC32 /nologo | |||||
LINK32=link.exe | |||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 | |||||
# ADD LINK32 kernel32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release_x86/espeak_sapi.dll" /libpath:"..\..\..\..\lib\i386" | |||||
# Begin Custom Build - Performing registration | |||||
OutDir=.\Release_x86 | |||||
TargetPath=.\Release_x86\espeak_sapi.dll | |||||
InputPath=.\Release_x86\espeak_sapi.dll | |||||
SOURCE="$(InputPath)" | |||||
"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" | |||||
regsvr32 /s /c "$(TargetPath)" | |||||
echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" | |||||
# End Custom Build | |||||
!ENDIF | |||||
# Begin Target | |||||
# Name "TtsEng - Win32 Debug x86" | |||||
# Name "TtsEng - Win32 Release x86" | |||||
# Begin Group "Source Files" | |||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | |||||
# Begin Source File | |||||
SOURCE=.\src\compiledict.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\dictionary.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\intonation.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\numbers.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\phonemelist.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\readclause.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\setlengths.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak_lib.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.cpp | |||||
# ADD BASE CPP /Yc"stdafx.h" | |||||
# ADD CPP /Yc"stdafx.h" | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synth_mbrola.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthdata.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_english.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEng.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEng.def | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEng.idl | |||||
# ADD BASE MTL /I "..\..\..\sdk\idl" /tlb ".\TtsEng.tlb" /h "TtsEng.h" /iid "" /Oicf | |||||
# ADD MTL /I "..\..\..\sdk\idl" /tlb ".\TtsEng.tlb" /h "TtsEng.h" /iid "TtsEng_i.c" /Oicf | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEng.rc | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEngObj.cpp | |||||
# SUBTRACT CPP /YX /Yc /Yu | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voices.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\wavegen.cpp | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Header Files" | |||||
# PROP Default_Filter "h;hpp;hxx;hm;inl" | |||||
# Begin Source File | |||||
SOURCE=.\src\phoneme.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\portaudio.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\portaudio18.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\portaudio19.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\Resource.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\sintab.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speak_lib.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\speech.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\StdAfx.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\synthesize.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\tr_languages.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\translate.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\TtsEngObj.h | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=.\src\voice.h | |||||
# End Source File | |||||
# End Group | |||||
# Begin Group "Resource Files" | |||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | |||||
# Begin Source File | |||||
SOURCE=.\TtsEngObj.rgs | |||||
# End Source File | |||||
# End Group | |||||
# End Target | |||||
# End Project |
Microsoft Developer Studio Workspace File, Format Version 6.00 | |||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | |||||
############################################################################### | |||||
Project: "TtsEng"=".\ttseng.dsp" - Package Owner=<4> | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<4> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
Global: | |||||
Package=<5> | |||||
{{{ | |||||
}}} | |||||
Package=<3> | |||||
{{{ | |||||
}}} | |||||
############################################################################### | |||||
/***************************************************************************** | |||||
* TtsEng.idl * | |||||
*------------* | |||||
* Description: | |||||
* This idl file is for the sample SAPI5 Text To Speech Engine. | |||||
*----------------------------------------------------------------------------- | |||||
* Creation: 09/17/99 | |||||
* Copyright (c) Microsoft Corporation. All rights reserved. | |||||
*****************************************************************************/ | |||||
//--- Import base idl | |||||
import "oaidl.idl"; | |||||
import "ocidl.idl"; | |||||
import "sapiddk.idl"; | |||||
//=== Forward References ====================================================== | |||||
//=== Constants =============================================================== | |||||
//=== Interface definitions =================================================== | |||||
typedef struct VOICEITEM | |||||
{ | |||||
LPCWSTR pText; | |||||
ULONG ulTextLen; | |||||
ULONG ulNumAudioBytes; | |||||
BYTE* pAudio; | |||||
} VOICEITEM; | |||||
//=== CoClass definitions ===================================================== | |||||
[ | |||||
uuid(7192AA2F-F759-43e9-91E7-226371EF6B2F), | |||||
version(1.0), | |||||
helpstring("Simple TTS Engine 1.0 Type Library") | |||||
] | |||||
library SAMPLETTSENGLib | |||||
{ | |||||
importlib("stdole32.tlb"); | |||||
importlib("stdole2.tlb"); | |||||
[ | |||||
uuid(BE985C8D-BE32-4A22-AA93-55C16A6D1D91), | |||||
// uuid(A832755E-9C2A-40b4-89B2-3A92EE705852), | |||||
helpstring("SampleTTSEngine Class") | |||||
] | |||||
coclass SampleTTSEngine | |||||
{ | |||||
[default] interface ISpTTSEngine; | |||||
interface ISpObjectWithToken; | |||||
}; | |||||
}; |
//Microsoft Developer Studio generated resource script. | |||||
// | |||||
#include "resource.h" | |||||
#define APSTUDIO_READONLY_SYMBOLS | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// Generated from the TEXTINCLUDE 2 resource. | |||||
// | |||||
#define APSTUDIO_HIDDEN_SYMBOLS | |||||
#include "windows.h" | |||||
#undef APSTUDIO_HIDDEN_SYMBOLS | |||||
#include "resource.h" | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
#undef APSTUDIO_READONLY_SYMBOLS | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// English (U.S.) resources | |||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) | |||||
#ifdef _WIN32 | |||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US | |||||
#pragma code_page(1252) | |||||
#endif //_WIN32 | |||||
#ifdef APSTUDIO_INVOKED | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// TEXTINCLUDE | |||||
// | |||||
1 TEXTINCLUDE DISCARDABLE | |||||
BEGIN | |||||
"resource.h\0" | |||||
END | |||||
2 TEXTINCLUDE DISCARDABLE | |||||
BEGIN | |||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n" | |||||
"#include ""windows.h""\r\n" | |||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" | |||||
"#include ""resource.h""\r\n" | |||||
"\r\n" | |||||
"\0" | |||||
END | |||||
3 TEXTINCLUDE DISCARDABLE | |||||
BEGIN | |||||
"1 TYPELIB ""TtsEng.tlb""\r\n" | |||||
"#include ""version.rc2""\r\n" | |||||
"\0" | |||||
END | |||||
#endif // APSTUDIO_INVOKED | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// REGISTRY | |||||
// | |||||
IDR_SAMPLETTSENGINE REGISTRY DISCARDABLE "TtsEngObj.rgs" | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// String Table | |||||
// | |||||
STRINGTABLE DISCARDABLE | |||||
BEGIN | |||||
IDS_PROJNAME "TtsEng" | |||||
END | |||||
#endif // English (U.S.) resources | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
#ifndef APSTUDIO_INVOKED | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// Generated from the TEXTINCLUDE 3 resource. | |||||
// | |||||
1 TYPELIB "TtsEng.tlb" | |||||
#include "version.rc2" | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
#endif // not APSTUDIO_INVOKED | |||||
/******************************************************************************* | |||||
* TtsEngObj.cpp * | |||||
*---------------* | |||||
* Description: | |||||
* This module is the main implementation file for the CTTSEngObj class. | |||||
*------------------------------------------------------------------------------- | |||||
* Creation Date: 03/24/99 | |||||
* Copyright (c) Microsoft Corporation. All rights reserved. | |||||
* All Rights Reserved | |||||
* | |||||
*******************************************************************************/ | |||||
//--- Additional includes | |||||
#include "stdafx.h" | |||||
#include "TtsEngObj.h" | |||||
#include "src/speak_lib.h" | |||||
#include "stdio.h" | |||||
//--- Local | |||||
//#define LOG_DEBUG | |||||
#define CTRL_EMBEDDED 1 | |||||
CTTSEngObj *m_EngObj; | |||||
ISpTTSEngineSite* m_OutputSite; | |||||
FILE *f_log2=NULL; | |||||
extern int AddNameData(const char *name, int wide); | |||||
extern void InitNamedata(void); | |||||
int master_volume = 100; | |||||
int master_rate = 0; | |||||
int gVolume = 100; | |||||
int gSpeed = -1; | |||||
int gPitch = -1; | |||||
int gRange = -1; | |||||
int gEmphasis = 0; | |||||
int gSayas = 0; | |||||
char *path_install = NULL; | |||||
unsigned long audio_offset = 0; | |||||
unsigned long audio_latest = 0; | |||||
unsigned int gBufSize = 0; | |||||
wchar_t *TextBuf=NULL; | |||||
typedef struct { | |||||
unsigned int bufix; | |||||
unsigned int textix; | |||||
unsigned int cmdlen; | |||||
} FRAG_OFFSET; | |||||
int srate; // samplerate, Hz/50 | |||||
int n_frag_offsets = 0; | |||||
int frag_ix = 0; | |||||
int frag_count=0; | |||||
FRAG_OFFSET *frag_offsets = NULL; | |||||
int SynthCallback(short *wav, int numsamples, espeak_EVENT *events); | |||||
int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) | |||||
{//================================================================ | |||||
int hr; | |||||
wchar_t *tailptr; | |||||
unsigned int text_offset; | |||||
int length; | |||||
espeak_EVENT *event; | |||||
#define N_EVENTS 100 | |||||
int n_Events = 0; | |||||
SPEVENT *Event; | |||||
SPEVENT Events[N_EVENTS]; | |||||
if(m_OutputSite->GetActions() & SPVES_ABORT) | |||||
return(1); | |||||
m_EngObj->CheckActions(m_OutputSite); | |||||
// return the events | |||||
for(event=events; event->type != 0; event++) | |||||
{ | |||||
audio_latest = event->audio_position + audio_offset; | |||||
if((event->type == espeakEVENT_WORD) && (event->length > 0)) | |||||
{ | |||||
while(((frag_ix+1) < frag_count) && | |||||
((event->text_position -1 + frag_offsets[frag_ix+1].cmdlen) >= frag_offsets[frag_ix+1].bufix)) | |||||
{ | |||||
frag_ix++; | |||||
} | |||||
text_offset = frag_offsets[frag_ix].textix + | |||||
event->text_position -1 - frag_offsets[frag_ix].bufix + frag_offsets[frag_ix].cmdlen; | |||||
length = event->length - frag_offsets[frag_ix].cmdlen; | |||||
frag_offsets[frag_ix].cmdlen = 0; | |||||
if(text_offset < 0) | |||||
text_offset = 0; | |||||
Event = &Events[n_Events++]; | |||||
Event->eEventId = SPEI_WORD_BOUNDARY; | |||||
Event->elParamType = SPET_LPARAM_IS_UNDEFINED; | |||||
Event->ullAudioStreamOffset = ((event->audio_position + audio_offset) * srate)/10; // ms -> bytes | |||||
Event->lParam = text_offset; | |||||
Event->wParam = length; | |||||
} | |||||
if(event->type == espeakEVENT_MARK) | |||||
{ | |||||
Event = &Events[n_Events++]; | |||||
Event->eEventId = SPEI_TTS_BOOKMARK; | |||||
Event->elParamType = SPET_LPARAM_IS_STRING; | |||||
Event->ullAudioStreamOffset = ((event->audio_position + audio_offset) * 441)/10; // ms -> bytes | |||||
Event->lParam = (long)event->id.name; | |||||
Event->wParam = wcstol((wchar_t *)event->id.name,&tailptr,10); | |||||
} | |||||
#ifdef deleted | |||||
if(event->type == espeakEVENT_SENTENCE) | |||||
{ | |||||
Event = &Events[n_Events++]; | |||||
Event->eEventId = SPEI_SENTENCE_BOUNDARY; | |||||
Event->elParamType = SPET_LPARAM_IS_UNDEFINED; | |||||
Event->ullAudioStreamOffset = (event->audio_position * 441)/10; // ms -> bytes | |||||
Event->lParam = event->text_position-1 + text_offset; | |||||
Event->wParam = 0; // TEMP | |||||
} | |||||
#endif | |||||
} | |||||
if(n_Events > 0) | |||||
m_OutputSite->AddEvents(Events, n_Events ); | |||||
// return the sound data | |||||
hr = m_OutputSite->Write(wav, numsamples*2, NULL); | |||||
return(hr); | |||||
} | |||||
static int ConvertRate(int new_rate) | |||||
{//================================= | |||||
int rate; | |||||
static int rate_table[21] = {80,100,116,124,132,140,148,156,164,170,176, | |||||
182,188,197,208,220,240,270,300,335,370 }; | |||||
rate = new_rate + master_rate; | |||||
if(rate < -10) rate = -10; | |||||
if(rate > 10) rate = 10; | |||||
return(rate_table[rate+10]); | |||||
} // end of ConvertRate | |||||
static int ConvertPitch(int pitch) | |||||
{//=============================== | |||||
static int pitch_table[41] = | |||||
{0, 0, 0, 0, 0, 0, 0, 0, 4, 8,12,16,20,24,28,32,36,40,44,47,50, | |||||
54,58,62,66,70,74,78,82,84,88,92,96,99,99,99,99,99,99,99,99}; | |||||
// {0,3,5,8,10,13,15,18,20,23,25,28,30,33,35,38,40,43,45,48,50, | |||||
// 53,55,58,60,63,65,68,70,73,75,78,80,83,85,88,90,93,95,97,99}; | |||||
if(pitch < -20) pitch = -20; | |||||
if(pitch > 20) pitch = 20; | |||||
return(pitch_table[pitch+20]); | |||||
} | |||||
static int ConvertRange(int range) | |||||
{//=============================== | |||||
static int range_table[21] = {16,28,39,49,58,66,74,81,88,94,100,105,110,115,120,125,130,135,140,145,150}; | |||||
if(range < -10) range = -10; | |||||
if(range > 10) range = 10; | |||||
return(range_table[range+10]/2); | |||||
} | |||||
/***************************************************************************** | |||||
* CTTSEngObj::FinalConstruct * | |||||
*----------------------------* | |||||
* Description: | |||||
* Constructor | |||||
*****************************************************************************/ | |||||
HRESULT CTTSEngObj::FinalConstruct() | |||||
{ | |||||
SPDBG_FUNC( "CTTSEngObj::FinalConstruct" ); | |||||
HRESULT hr = S_OK; | |||||
#ifdef LOG_DEBUG | |||||
f_log2=fopen("C:\\log_espeak","a"); | |||||
if(f_log2) fprintf(f_log2,"\n****\n"); | |||||
#endif | |||||
//--- Init vars | |||||
m_hVoiceData = NULL; | |||||
m_pVoiceData = NULL; | |||||
m_pWordList = NULL; | |||||
m_ulNumWords = 0; | |||||
m_EngObj = this; | |||||
return hr; | |||||
} /* CTTSEngObj::FinalConstruct */ | |||||
/***************************************************************************** | |||||
* CTTSEngObj::FinalRelease * | |||||
*--------------------------* | |||||
* Description: | |||||
* destructor | |||||
*****************************************************************************/ | |||||
void CTTSEngObj::FinalRelease() | |||||
{ | |||||
SPDBG_FUNC( "CTTSEngObj::FinalRelease" ); | |||||
delete m_pWordList; | |||||
#ifdef LOG_DEBUG | |||||
if(f_log2!=NULL) fclose(f_log2); | |||||
#endif | |||||
if( m_pVoiceData ) | |||||
{ | |||||
::UnmapViewOfFile( (void*)m_pVoiceData ); | |||||
} | |||||
if( m_hVoiceData ) | |||||
{ | |||||
::CloseHandle( m_hVoiceData ); | |||||
} | |||||
} /* CTTSEngObj::FinalRelease */ | |||||
// | |||||
//=== ISpObjectWithToken Implementation ====================================== | |||||
// | |||||
void WcharToChar(char *out, const wchar_t *in, int len) | |||||
{//==================================================== | |||||
int ix; | |||||
for(ix=0; ix<len; ix++) | |||||
{ | |||||
if((out[ix] = (char)in[ix]) == 0) | |||||
break; | |||||
} | |||||
out[len-1] = 0; | |||||
} | |||||
/***************************************************************************** | |||||
* CTTSEngObj::SetObjectToken * | |||||
*----------------------------* | |||||
* Description: | |||||
* Read the "VoiceName" attribute from the registry, and use it to select | |||||
* an eSpeak voice file | |||||
*****************************************************************************/ | |||||
STDMETHODIMP CTTSEngObj::SetObjectToken(ISpObjectToken * pToken) | |||||
{ | |||||
char voice[80]; | |||||
strcpy(voice,"default"); | |||||
SPDBG_FUNC( "CTTSEngObj::SetObjectToken" ); | |||||
HRESULT hr = SpGenericSetObjectToken(pToken, m_cpToken); | |||||
if( SUCCEEDED( hr ) ) | |||||
{ | |||||
CSpDynamicString voicename; | |||||
CSpDynamicString path; | |||||
HRESULT hr2; | |||||
int len; | |||||
hr2 = m_cpToken->GetStringValue( L"VoiceName", &voicename); | |||||
if( SUCCEEDED(hr2) ) | |||||
{ | |||||
WcharToChar(voice,voicename,sizeof(voice)); | |||||
} | |||||
hr2 = m_cpToken->GetStringValue( L"Path", &path); | |||||
if( SUCCEEDED(hr2) ) | |||||
{ | |||||
len = wcslen(path)+1; | |||||
path_install = (char *)malloc(len); | |||||
WcharToChar(path_install,path,len); | |||||
} | |||||
} | |||||
gVolume = 100; | |||||
gSpeed = -1; | |||||
gPitch = -1; | |||||
gRange = -1; | |||||
gEmphasis = 0; | |||||
gSayas = 0; | |||||
espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,100,path_install); | |||||
espeak_SetVoiceByName(voice); | |||||
espeak_SetSynthCallback(SynthCallback); | |||||
return hr; | |||||
} /* CTTSEngObj::SetObjectToken */ | |||||
// | |||||
//=== ISpTTSEngine Implementation ============================================ | |||||
// | |||||
int CTTSEngObj::ProcessFragList(const SPVTEXTFRAG* pTextFragList, wchar_t *pW_start, ISpTTSEngineSite* pOutputSite, int *n_text) | |||||
{//============================================================================================================================= | |||||
int action; | |||||
int control; | |||||
wchar_t *pW; | |||||
const SPVSTATE *state; | |||||
unsigned int ix; | |||||
unsigned int len; | |||||
unsigned int total=0; | |||||
char cmdbuf[50]; | |||||
wchar_t markbuf[32]; | |||||
int speed; | |||||
int volume; | |||||
int pitch; | |||||
int range; | |||||
int emphasis; | |||||
int sayas; | |||||
unsigned int text_offset = 0; | |||||
frag_count = 0; | |||||
frag_ix = 0; | |||||
pW = pW_start; | |||||
while(pTextFragList != NULL) | |||||
{ | |||||
action = pTextFragList->State.eAction; | |||||
control = pOutputSite->GetActions(); | |||||
len = pTextFragList->ulTextLen; | |||||
if(control & SPVES_ABORT) | |||||
break; | |||||
CheckActions(pOutputSite); | |||||
sayas = 0; | |||||
switch(action) | |||||
{ | |||||
case SPVA_SpellOut: | |||||
sayas = 0x12; // SAYAS_CHARS; // drop through to SPVA_Speak | |||||
case SPVA_Speak: | |||||
text_offset = pTextFragList->ulTextSrcOffset; | |||||
audio_offset = audio_latest; | |||||
#ifdef deleted | |||||
// attempt to recognise when JAWS is spelling, it doesn't use SPVA_SpellOut | |||||
if((pW != NULL) && (*n_text == 1) && ((len == 1) || ((len==2) && (pTextFragList->pTextStart[1]==' ')))) | |||||
{ | |||||
// A single text fragment with one character. Speak as a character, not a word | |||||
sayas = 0x11; | |||||
gSayas = 0; | |||||
} | |||||
#endif | |||||
if(frag_count >= n_frag_offsets) | |||||
{ | |||||
if((frag_offsets = (FRAG_OFFSET *)realloc(frag_offsets,sizeof(FRAG_OFFSET)*(frag_count+500))) != NULL) | |||||
{ | |||||
n_frag_offsets = frag_count+500; | |||||
} | |||||
} | |||||
// first set the volume, rate, pitch | |||||
state = &pTextFragList->State; | |||||
volume = (state->Volume * master_volume)/100; | |||||
speed = ConvertRate(state->RateAdj); | |||||
pitch = ConvertPitch(state->PitchAdj.MiddleAdj); | |||||
range = ConvertRange(state->PitchAdj.RangeAdj); | |||||
emphasis = state->EmphAdj; | |||||
if(emphasis != 0) | |||||
emphasis = 3; | |||||
len = 0; | |||||
if(volume != gVolume) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dA",CTRL_EMBEDDED,volume); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
if(speed != gSpeed) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dS",CTRL_EMBEDDED,speed); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
if(pitch != gPitch) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dP",CTRL_EMBEDDED,pitch); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
if(range != gRange) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dR",CTRL_EMBEDDED,range); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
if(emphasis != gEmphasis) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dF",CTRL_EMBEDDED,emphasis); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
if(sayas != gSayas) | |||||
{ | |||||
sprintf(&cmdbuf[len],"%c%dY",CTRL_EMBEDDED,sayas); | |||||
len += strlen(&cmdbuf[len]); | |||||
} | |||||
gVolume = volume; | |||||
gSpeed = speed; | |||||
gPitch = pitch; | |||||
gRange = range; | |||||
gEmphasis = emphasis; | |||||
gSayas = sayas; | |||||
total += (len + pTextFragList->ulTextLen); | |||||
if(pTextFragList->ulTextLen > 0) | |||||
{ | |||||
total++; | |||||
} | |||||
if(pW != NULL) | |||||
{ | |||||
for(ix=0; ix<len; ix++) | |||||
{ | |||||
*pW++ = cmdbuf[ix]; | |||||
} | |||||
frag_offsets[frag_count].textix = text_offset; | |||||
frag_offsets[frag_count].bufix = pW - pW_start; | |||||
frag_offsets[frag_count].cmdlen = len; | |||||
for(ix=0; ix<pTextFragList->ulTextLen; ix++) | |||||
{ | |||||
*pW++ = pTextFragList->pTextStart[ix]; | |||||
} | |||||
if(pTextFragList->ulTextLen > 0) | |||||
{ | |||||
*pW++ = ' '; | |||||
} | |||||
} | |||||
frag_count++; | |||||
break; | |||||
case SPVA_Bookmark: | |||||
total += (2 + pTextFragList->ulTextLen); | |||||
if(pW != NULL) | |||||
{ | |||||
int index; | |||||
for(ix=0; ix<pTextFragList->ulTextLen; ix++) | |||||
{ | |||||
markbuf[ix] = (char )pTextFragList->pTextStart[ix]; | |||||
} | |||||
markbuf[ix] = 0; | |||||
if((index = AddNameData((const char *)markbuf,1)) >= 0) | |||||
{ | |||||
sprintf(cmdbuf,"%c%dM",CTRL_EMBEDDED,index); | |||||
len = strlen(cmdbuf); | |||||
for(ix=0; ix<len; ix++) | |||||
{ | |||||
*pW++ = cmdbuf[ix]; | |||||
} | |||||
} | |||||
} | |||||
break; | |||||
} | |||||
pTextFragList = pTextFragList->pNext; | |||||
} | |||||
if(pW != NULL) | |||||
{ | |||||
*pW = 0; | |||||
} | |||||
*n_text = frag_count; | |||||
return(total); | |||||
} // end of ProcessFragList | |||||
/***************************************************************************** | |||||
* CTTSEngObj::Speak * | |||||
*-------------------* | |||||
* Description: | |||||
* This is the primary method that SAPI calls to render text. | |||||
*----------------------------------------------------------------------------- | |||||
* Input Parameters | |||||
* | |||||
* pUser | |||||
* Pointer to the current user profile object. This object contains | |||||
* information like what languages are being used and this object | |||||
* also gives access to resources like the SAPI master lexicon object. | |||||
* | |||||
* dwSpeakFlags | |||||
* This is a set of flags used to control the behavior of the | |||||
* SAPI voice object and the associated engine. | |||||
* | |||||
* VoiceFmtIndex | |||||
* Zero based index specifying the output format that should | |||||
* be used during rendering. | |||||
* | |||||
* pTextFragList | |||||
* A linked list of text fragments to be rendered. There is | |||||
* one fragement per XML state change. If the input text does | |||||
* not contain any XML markup, there will only be a single fragment. | |||||
* | |||||
* pOutputSite | |||||
* The interface back to SAPI where all output audio samples and events are written. | |||||
* | |||||
* Return Values | |||||
* S_OK - This should be returned after successful rendering or if | |||||
* rendering was interrupted because *pfContinue changed to FALSE. | |||||
* E_INVALIDARG | |||||
* E_OUTOFMEMORY | |||||
* | |||||
*****************************************************************************/ | |||||
STDMETHODIMP CTTSEngObj::Speak( DWORD dwSpeakFlags, | |||||
REFGUID rguidFormatId, | |||||
const WAVEFORMATEX * pWaveFormatEx, | |||||
const SPVTEXTFRAG* pTextFragList, | |||||
ISpTTSEngineSite* pOutputSite ) | |||||
{ | |||||
SPDBG_FUNC( "CTTSEngObj::Speak" ); | |||||
HRESULT hr = S_OK; | |||||
unsigned int size; | |||||
int xVolume; | |||||
int xSpeed; | |||||
int xPitch; | |||||
int xRange; | |||||
int xEmphasis; | |||||
int xSayas; | |||||
int punctuation; | |||||
int n_text_frag=0; | |||||
//--- Check args | |||||
if( SP_IS_BAD_INTERFACE_PTR( pOutputSite ) || | |||||
SP_IS_BAD_READ_PTR( pTextFragList ) ) | |||||
{ | |||||
hr = E_INVALIDARG; | |||||
} | |||||
else | |||||
{ | |||||
InitNamedata(); | |||||
//--- Init some vars | |||||
m_pCurrFrag = pTextFragList; | |||||
m_pNextChar = m_pCurrFrag->pTextStart; | |||||
m_pEndChar = m_pNextChar + m_pCurrFrag->ulTextLen; | |||||
m_ullAudioOff = 0; | |||||
m_OutputSite = pOutputSite; | |||||
xVolume = gVolume; | |||||
xSpeed = gSpeed; | |||||
xPitch = gPitch; | |||||
xRange = gRange; | |||||
xEmphasis = gEmphasis; | |||||
xSayas = gSayas; | |||||
// find the size of the text buffer needed for this Speak() request | |||||
size = ProcessFragList(pTextFragList,NULL,pOutputSite,&n_text_frag); | |||||
gVolume = xVolume; | |||||
gSpeed = xSpeed; | |||||
gPitch = xPitch; | |||||
gRange = xRange; | |||||
gEmphasis = xEmphasis; | |||||
gSayas = xSayas; | |||||
punctuation = 0; | |||||
if(dwSpeakFlags & SPF_NLP_SPEAK_PUNC) | |||||
punctuation = 1; | |||||
espeak_SetParameter(espeakPUNCTUATION,punctuation,0); | |||||
size = (size + 50)*sizeof(wchar_t); | |||||
if(size > gBufSize) | |||||
{ | |||||
size += 1000; // some extra so we don't need to realloc() again too often | |||||
TextBuf = (wchar_t *)realloc(TextBuf,size); | |||||
if(TextBuf == NULL) | |||||
{ | |||||
gBufSize=0; | |||||
return(1); | |||||
} | |||||
gBufSize = size; | |||||
} | |||||
audio_latest = 0; | |||||
size = ProcessFragList(pTextFragList,TextBuf,pOutputSite,&n_text_frag); | |||||
if(size > 0) | |||||
{ | |||||
espeak_Synth(TextBuf,0,0,POS_CHARACTER,0,espeakCHARS_WCHAR | espeakKEEP_NAMEDATA,NULL,NULL); | |||||
} | |||||
} | |||||
return hr; | |||||
} /* CTTSEngObj::Speak */ | |||||
HRESULT CTTSEngObj::CheckActions( ISpTTSEngineSite* pOutputSite ) | |||||
{//============================================================== | |||||
int control; | |||||
USHORT volume; | |||||
long rate; | |||||
control = pOutputSite->GetActions(); | |||||
if(control & SPVES_VOLUME) | |||||
{ | |||||
if(pOutputSite->GetVolume(&volume) == S_OK) | |||||
{ | |||||
master_volume = volume; | |||||
} | |||||
} | |||||
if(control & SPVES_RATE) | |||||
{ | |||||
if(pOutputSite->GetRate(&rate) == S_OK) | |||||
{ | |||||
master_rate = rate; | |||||
} | |||||
} | |||||
return(S_OK); | |||||
} // end of CTTSEngObj::CheckActions | |||||
/***************************************************************************** | |||||
* CTTSEngObj::GetVoiceFormat * | |||||
*----------------------------* | |||||
* Description: | |||||
* This method returns the output data format associated with the | |||||
* specified format Index. Formats are in order of quality with the best | |||||
* starting at 0. | |||||
*****************************************************************************/ | |||||
STDMETHODIMP CTTSEngObj::GetOutputFormat( const GUID * pTargetFormatId, const WAVEFORMATEX * pTargetWaveFormatEx, | |||||
GUID * pDesiredFormatId, WAVEFORMATEX ** ppCoMemDesiredWaveFormatEx ) | |||||
{ | |||||
SPDBG_FUNC( "CTTSEngObj::GetVoiceFormat" ); | |||||
HRESULT hr = S_OK; | |||||
enum SPSTREAMFORMAT sample_rate = SPSF_22kHz16BitMono; | |||||
srate = 441; | |||||
if(espeak_GetParameter(espeakVOICETYPE,1) == 1) | |||||
{ | |||||
srate = 320; | |||||
sample_rate = SPSF_16kHz16BitMono; // an mbrola voice | |||||
} | |||||
hr = SpConvertStreamFormatEnum(sample_rate, pDesiredFormatId, ppCoMemDesiredWaveFormatEx); | |||||
return hr; | |||||
} /* CTTSEngObj::GetVoiceFormat */ | |||||
int FAR PASCAL CompileDictionary(const char *voice, const char *path_log) | |||||
{//=========================================================== | |||||
FILE *f_log; | |||||
char fname[120]; | |||||
f_log = fopen(path_log,"w"); | |||||
sprintf(fname,"%s/",path_install); | |||||
espeak_SetVoiceByName(voice); | |||||
espeak_CompileDictionary(fname,f_log); | |||||
fclose(f_log); | |||||
return(0); | |||||
} | |||||
/****************************************************************************** | |||||
* TtsEngObj.h * | |||||
*-------------* | |||||
* This is the header file for the sample CTTSEngObj class definition. | |||||
*------------------------------------------------------------------------------ | |||||
* Copyright (c) Microsoft Corporation. All rights reserved. | |||||
* | |||||
******************************************************************************/ | |||||
#ifndef TtsEngObj_h | |||||
#define TtsEngObj_h | |||||
//--- Additional includes | |||||
#ifndef __TtsEng_h__ | |||||
#include "ttseng.h" | |||||
#endif | |||||
#ifndef SPDDKHLP_h | |||||
#include <spddkhlp.h> | |||||
#endif | |||||
#ifndef SPCollec_h | |||||
#include <spcollec.h> | |||||
#endif | |||||
#include "resource.h" | |||||
__declspec( dllexport )int FAR PASCAL _export CompileDictionary(const char *voice, const char *path_log); | |||||
//=== Constants ==================================================== | |||||
//=== Class, Enum, Struct and Union Declarations =================== | |||||
//=== Enumerated Set Definitions =================================== | |||||
//=== Function Type Definitions ==================================== | |||||
//=== Class, Struct and Union Definitions ========================== | |||||
/*** CSentItem | |||||
* This object is a helper class | |||||
*/ | |||||
class CSentItem | |||||
{ | |||||
public: | |||||
CSentItem() { memset( this, 0, sizeof(*this) ); } | |||||
CSentItem( CSentItem& Other ) { memcpy( this, &Other, sizeof( Other ) ); } | |||||
/*--- Data members ---*/ | |||||
const SPVSTATE* pXmlState; | |||||
LPCWSTR pItem; | |||||
ULONG ulItemLen; | |||||
ULONG ulItemSrcOffset; // Original source character position | |||||
ULONG ulItemSrcLen; // Length of original source item in characters | |||||
}; | |||||
typedef CSPList<CSentItem,CSentItem&> CItemList; | |||||
/*** CTTSEngObj COM object ******************************** | |||||
*/ | |||||
class ATL_NO_VTABLE CTTSEngObj : | |||||
public CComObjectRootEx<CComMultiThreadModel>, | |||||
public CComCoClass<CTTSEngObj, &CLSID_SampleTTSEngine>, | |||||
public ISpTTSEngine, | |||||
public ISpObjectWithToken | |||||
{ | |||||
/*=== ATL Setup ===*/ | |||||
public: | |||||
DECLARE_REGISTRY_RESOURCEID(IDR_SAMPLETTSENGINE) | |||||
DECLARE_PROTECT_FINAL_CONSTRUCT() | |||||
BEGIN_COM_MAP(CTTSEngObj) | |||||
COM_INTERFACE_ENTRY(ISpTTSEngine) | |||||
COM_INTERFACE_ENTRY(ISpObjectWithToken) | |||||
END_COM_MAP() | |||||
/*=== Methods =======*/ | |||||
public: | |||||
/*--- Constructors/Destructors ---*/ | |||||
HRESULT FinalConstruct(); | |||||
void FinalRelease(); | |||||
/*=== Interfaces ====*/ | |||||
public: | |||||
//--- ISpObjectWithToken ---------------------------------- | |||||
STDMETHODIMP SetObjectToken( ISpObjectToken * pToken ); | |||||
STDMETHODIMP GetObjectToken( ISpObjectToken ** ppToken ) | |||||
{ return SpGenericGetObjectToken( ppToken, m_cpToken ); } | |||||
//--- ISpTTSEngine -------------------------------------------- | |||||
STDMETHOD(Speak)( DWORD dwSpeakFlags, | |||||
REFGUID rguidFormatId, const WAVEFORMATEX * pWaveFormatEx, | |||||
const SPVTEXTFRAG* pTextFragList, ISpTTSEngineSite* pOutputSite ); | |||||
STDMETHOD(GetOutputFormat)( const GUID * pTargetFormatId, const WAVEFORMATEX * pTargetWaveFormatEx, | |||||
GUID * pDesiredFormatId, WAVEFORMATEX ** ppCoMemDesiredWaveFormatEx ); | |||||
HRESULT CheckActions( ISpTTSEngineSite* pOutputSite ); | |||||
int ProcessFragList(const SPVTEXTFRAG* pTextFragList, wchar_t *pW, ISpTTSEngineSite* pOutputSite, int *n_text); | |||||
private: | |||||
/*--- Non interface methods ---*/ | |||||
/*=== Member Data ===*/ | |||||
private: | |||||
CComPtr<ISpObjectToken> m_cpToken; | |||||
HANDLE m_hVoiceData; | |||||
void* m_pVoiceData; | |||||
//--- Voice (word/audio data) list | |||||
// Note: You will probably have something more sophisticated here | |||||
// we are just trying to keep it simple for the example. | |||||
VOICEITEM* m_pWordList; | |||||
ULONG m_ulNumWords; | |||||
//--- Working variables to walk the text fragment list during Speak() | |||||
const SPVTEXTFRAG* m_pCurrFrag; | |||||
const WCHAR* m_pNextChar; | |||||
const WCHAR* m_pEndChar; | |||||
ULONGLONG m_ullAudioOff; | |||||
}; | |||||
#endif //--- This must be the last line in the file |
HKCR | |||||
{ | |||||
TtsEng.SampleTTSEngine.1 = s 'SampleTTSEngine Class' | |||||
{ | |||||
CLSID = s '{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}' | |||||
} | |||||
TtsEng.SampleTTSEngine = s 'SampleTTSEngine Class' | |||||
{ | |||||
CLSID = s '{BE985C8D-BE32-4A22-AA93-55C16A6D1D91}' | |||||
CurVer = s 'TtsEng.SampleTTSEngine.1' | |||||
} | |||||
NoRemove CLSID | |||||
{ | |||||
ForceRemove {BE985C8D-BE32-4A22-AA93-55C16A6D1D91} = s 'SampleTTSEngine Class' | |||||
{ | |||||
ProgID = s 'TtsEng.SampleTTSEngine.1' | |||||
VersionIndependentProgID = s 'TtsEng.SampleTTSEngine' | |||||
InprocServer32 = s '%MODULE%' | |||||
{ | |||||
val ThreadingModel = s 'Both' | |||||
} | |||||
'TypeLib' = s '{7192AA2F-F759-43E9-91E7-226371EF6B2F}' | |||||
} | |||||
} | |||||
} |
/**************************************************************************** | |||||
* * | |||||
* VERSION.H -- Version information for internal builds * | |||||
* * | |||||
* This file is only modified by the official builder to update the * | |||||
* VERSION, VER_PRODUCTVERSION and VER_PRODUCTVERSION_STR values * | |||||
* * | |||||
* version.h is created on the fly from verhead.bat and vertail.h, * | |||||
* with the current version numbers inserted in between * | |||||
* * | |||||
****************************************************************************/ | |||||
#ifndef VER_H | |||||
/* ver.h defines constants needed by the VS_VERSION_INFO structure */ | |||||
//#include <winver.h> | |||||
#endif | |||||
#include <windows.h> | |||||
#define VER_FILETYPE VFT_APP | |||||
#define VER_FILESUBTYPE VFT2_UNKNOWN | |||||
#define VER_FILEDESCRIPTION_STR "TTS SAMPLE ENGINE 5" | |||||
#define VER_INTERNALNAME_STR "TTSSAMPLEENG5" | |||||
/*--------------------------------------------------------------*/ | |||||
/* the following entry should be phased out in favor of */ | |||||
/* VER_PRODUCTVERSION_STR, but is used in the shell today. */ | |||||
/*--------------------------------------------------------------*/ | |||||
/*--------------------------------------------------------------*/ | |||||
/* the following values should be modified by the official */ | |||||
/* builder for each build */ | |||||
/*--------------------------------------------------------------*/ | |||||
#define VERSION "5.0" | |||||
#define VER_FILEVERSION_STR "5.0" | |||||
#define VER_FILEVERSION 5,0 | |||||
#define VER_PRODUCTVERSION_STR "5.0" | |||||
#define VER_PRODUCTVERSION 5,0 | |||||
#define OFFICIAL 1 | |||||
#define FINAL 1 | |||||
/*--------------------------------------------------------------*/ | |||||
/* the following section defines values used in the version */ | |||||
/* data structure for all files, and which do not change. */ | |||||
/*--------------------------------------------------------------*/ | |||||
/* default is nodebug */ | |||||
#if _DEBUG | |||||
#define VER_DEBUG VS_FF_DEBUG | |||||
#else | |||||
#define VER_DEBUG 0 | |||||
#endif | |||||
/* default is privatebuild */ | |||||
#ifndef OFFICIAL | |||||
#define VER_PRIVATEBUILD VS_FF_PRIVATEBUILD | |||||
#else | |||||
#define VER_PRIVATEBUILD 0 | |||||
#endif | |||||
/* default is prerelease */ | |||||
#ifndef FINAL | |||||
#define VER_PRERELEASE VS_FF_PRERELEASE | |||||
#else | |||||
#define VER_PRERELEASE 0 | |||||
#endif | |||||
#define VER_FILEFLAGSMASK VS_FFI_FILEFLAGSMASK | |||||
#define VER_FILEOS VOS_DOS_WINDOWS32 | |||||
#define VER_FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) | |||||
#define VER_COMPANYNAME_STR "Microsoft Corporation\0" | |||||
#define VER_PRODUCTNAME_STR "Microsoft\256 Windows(TM) Operating System\0" | |||||
#define VER_LEGALTRADEMARKS_STR \ | |||||
"Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0" | |||||
//#include "\sapi5\build\common.ver" |
#ifndef _MAC | |||||
///////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// Version | |||||
// | |||||
VS_VERSION_INFO VERSIONINFO | |||||
FILEVERSION 1,0,24,00 | |||||
PRODUCTVERSION 1,0,24,00 | |||||
FILEFLAGSMASK 0x3fL | |||||
#ifdef _DEBUG | |||||
FILEFLAGS 0x1L | |||||
#else | |||||
FILEFLAGS 0x0L | |||||
#endif | |||||
FILEOS 0x40004L | |||||
FILETYPE 0x1L | |||||
FILESUBTYPE 0x0L | |||||
BEGIN | |||||
BLOCK "StringFileInfo" | |||||
BEGIN | |||||
BLOCK "040904b0" | |||||
BEGIN | |||||
VALUE "Comments", "\0" | |||||
VALUE "CompanyName", "Jonathan Duddington\0" | |||||
VALUE "FileDescription", "Text to Speech\0" | |||||
VALUE "FileVersion", "1, 0,24,00\0" | |||||
VALUE "InternalName", "espeak1.24\0" | |||||
VALUE "LegalCopyright", "Copyright (c) Jonathan Duddington\0" | |||||
VALUE "LegalTrademarks", "\0" | |||||
VALUE "OriginalFilename", "espeak_sapi.dll\0" | |||||
VALUE "PrivateBuild", "\0" | |||||
VALUE "ProductName", "espeak TTS\0" | |||||
VALUE "ProductVersion", "1, 0, 24, 00\0" | |||||
VALUE "SpecialBuild", "\0" | |||||
END | |||||
END | |||||
BLOCK "VarFileInfo" | |||||
BEGIN | |||||
VALUE "Translation", 0x809, 1200 | |||||
END | |||||
END | |||||
#endif // !_MAC |