|
3 months ago | |
---|---|---|
.gitignore | 4 months ago | |
LICENSE | 5 months ago | |
README.md | 4 months ago | |
add-voice.ps1 | 5 months ago | |
buildtools.png | 5 months ago | |
getoptw.c | 5 months ago | |
getoptw.h | 5 months ago | |
list-voices.ps1 | 5 months ago | |
riffpad.png | 5 months ago | |
sapicli.cpp | 3 months ago | |
sapicli.sln | 4 months ago | |
sapicli.vcxproj | 3 months ago | |
sapierr.h | 5 months ago | |
test.bat | 3 months ago | |
zip.bat | 3 months ago |
README.md
SAPI command line interface
A simple tool to generate audio from text.
Using getoptW.
https://github.com/Essjay1/Windows-classic-samples/blob/master/Samples/Win7Samples/com/fundamentals/dcom/simple/sserver/sserver.cpp https://github.com/nodejs/node/issues/16553 http://riaevangelist.github.io/node-ipc/
Development process
Microsoft can suck a big fat poopy pee pee.
Installing
- Install Visual Studio Build Tools (direct download), and click on "Desktop Development with C++", on the right make sure to check "C++ ATL for latest ...", and you can uncheck "C++ Cmake tools ...", "Testing tools ..." and "C++ AddressSanitizer", to save on space.
After installing, run "Developer Command Prompt for VS 2022" from the start menu, or just hit "Launch" in Visual Studio Installer. cd
to the folder where you've cloned this repo, cd to sapicli
, and type:
msbuild sapicli.vcxproj -p:Configuration=Release
Links
- SAPI XML Tutorial
- How to list all SAPI voices
- SpEnumTokens examples
- List attributes for voices
- American English Phoneme Representation
- RIFFPad
- SPEVENTENUM
- SPVISEMES
EVNT chunk
.wav
files generated by using SPBindToFile()
contain an EVNT chunk, which is a list of serialized events, their structure being that of SPSERIALIZEDEVENT
plus any string referenced inside the event itself.
The first byte is the event type, and most events are 24 bytes long. Strings that follow events are in wide char format. String lengths are padded upwards to multiples of 4. So if the string is 126 bytes, it is stored as 128 bytes, with the last two bytes beign zeroes.
Excerpt from sphelper.h
:
/****************************************************************************
* SpSerializedEventSize *
*-----------------------*
* Description:
* Returns the size, in bytes, used by a serialized event. The caller can
* pass a pointer to either a SPSERIAILZEDEVENT or SPSERIALIZEDEVENT64 structure.
*
* Returns:
* Number of bytes used by serizlied event
*
*****************************************************************************/
template <class T>
inline ULONG SpSerializedEventSize(const T * pSerEvent)
{
ULONG ulSize = sizeof(T);
if( ( pSerEvent->elParamType == SPET_LPARAM_IS_POINTER ) && pSerEvent->SerializedlParam )
{
ulSize += ULONG(pSerEvent->SerializedwParam);
}
else if ((pSerEvent->elParamType == SPET_LPARAM_IS_STRING || pSerEvent->elParamType == SPET_LPARAM_IS_TOKEN) &&
pSerEvent->SerializedlParam != NULL)
{
ulSize += ((ULONG)wcslen((WCHAR*)(pSerEvent + 1)) + 1) * sizeof( WCHAR );
}
// Round up to nearest DWORD
ulSize += 3;
ulSize -= ulSize % 4;
return ulSize;
}