From a1b780e670a0a3c7e7a32b7e62cf8d3e371d6d4b Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sun, 9 Sep 2012 11:31:05 +0200 Subject: [PATCH] Add support for Microsoft Speech Platform. MSSP is accessible via vbs by simply changing the object to be used (both SAPI5 and MSSP use the ISpVoice COM interface). Add command line parameter to sapi_voice.vbs to switch the COM object used, and add the necessary implementation of the SAPI class to Rockbox Utility. Important: you will need to install the Speech Runtime separately and install the version matching the bitsize of Rockbox Utility. I.e. you will need to install the x86 version even on a x64 machine (unless you build a 64bit binary of Rockbox Utility). Change-Id: If760cd69c556c17a2ae539965d0941d16fdc10e1 --- rbutil/rbutilqt/base/ttsbase.cpp | 4 +++ rbutil/rbutilqt/base/ttsmssp.h | 44 ++++++++++++++++++++++++++++++++ rbutil/rbutilqt/rbutilqt.pri | 1 + tools/sapi_voice.vbs | 17 ++++++++---- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 rbutil/rbutilqt/base/ttsmssp.h diff --git a/rbutil/rbutilqt/base/ttsbase.cpp b/rbutil/rbutilqt/base/ttsbase.cpp index 5955f825b4..ae2a78f606 100644 --- a/rbutil/rbutilqt/base/ttsbase.cpp +++ b/rbutil/rbutilqt/base/ttsbase.cpp @@ -21,6 +21,7 @@ #include "ttsfestival.h" #include "ttssapi.h" #include "ttssapi4.h" +#include "ttsmssp.h" #include "ttsexes.h" #if defined(Q_OS_MACX) #include "ttscarbon.h" @@ -47,6 +48,7 @@ void TTSBase::initTTSList() ttsList["sapi4"] = tr("SAPI4 TTS Engine"); #endif ttsList["sapi"] = tr("SAPI5 TTS Engine"); + ttsList["mssp"] = tr("MS Speech Platform"); #endif #if defined(Q_OS_LINUX) ttsList["festival"] = tr("Festival TTS Engine"); @@ -66,6 +68,8 @@ TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) tts = new TTSSapi(parent); else if (ttsName == "sapi4") tts = new TTSSapi4(parent); + else if (ttsName == "mssp") + tts = new TTSMssp(parent); else #elif defined(Q_OS_LINUX) if (ttsName == "festival") diff --git a/rbutil/rbutilqt/base/ttsmssp.h b/rbutil/rbutilqt/base/ttsmssp.h new file mode 100644 index 0000000000..72300e8f79 --- /dev/null +++ b/rbutil/rbutilqt/base/ttsmssp.h @@ -0,0 +1,44 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* +* Copyright (C) 2012 by Dominik Riebeling +* +* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ + +#ifndef TTSMSSP_H +#define TTSMSSP_H + +#include "ttsbase.h" +#include "ttssapi.h" + +class TTSMssp: public TTSSapi +{ + //! Enum to identify the settings + Q_OBJECT + public: + TTSMssp(QObject* parent=NULL) + { + m_TTSTemplate = "cscript //nologo \"%exe\" " + "/language:%lang /voice:\"%voice\" " + "/speed:%speed \"%options\" /mssp"; + m_TTSVoiceTemplate = "cscript //nologo \"%exe\" " + "/language:%lang /listvoices /mssp"; + m_TTSType = "mssp"; + } + +}; + +#endif diff --git a/rbutil/rbutilqt/rbutilqt.pri b/rbutil/rbutilqt/rbutilqt.pri index b6aac3bb43..5ee1f7b9d2 100644 --- a/rbutil/rbutilqt/rbutilqt.pri +++ b/rbutil/rbutilqt/rbutilqt.pri @@ -114,6 +114,7 @@ HEADERS += \ base/ttsfestival.h \ base/ttssapi.h \ base/ttssapi4.h \ + base/ttsmssp.h \ ../../tools/wavtrim.h \ ../../tools/voicefont.h \ base/voicefile.h \ diff --git a/tools/sapi_voice.vbs b/tools/sapi_voice.vbs index a8b98ac924..c6c2c69372 100644 --- a/tools/sapi_voice.vbs +++ b/tools/sapi_voice.vbs @@ -39,6 +39,7 @@ Const STDERR = 2 Dim oShell, oArgs, oEnv Dim oFSO, oStdIn, oStdOut Dim bVerbose, bSAPI4, bList +Dim bMSSP Dim sLanguage, sVoice, sSpeed, sName, sVendor Dim oSpVoice, oSpFS ' SAPI5 voice and filestream @@ -60,6 +61,7 @@ bVerbose = (oEnv("V") <> "") Set oArgs = WScript.Arguments.Named bSAPI4 = oArgs.Exists("sapi4") +bMSSP = oArgs.Exists("mssp") bList = oArgs.Exists("listvoices") sLanguage = oArgs.Item("language") sVoice = oArgs.Item("voice") @@ -121,20 +123,25 @@ If bSAPI4 Then ' Speed selection If sSpeed <> "" Then oTTS.Speed = sSpeed - + ' Get vendor information sVendor = oTTS.MfgName(nMode) Else ' SAPI5 ' Create SAPI5 object - Set oSpVoice = CreateObject("SAPI.SpVoice") + If bMSSP Then + Set oSpVoice = CreateObject("speech.SpVoice") + Else + Set oSpVoice = CreateObject("SAPI.SpVoice") + End If If Err.Number <> 0 Then - WScript.StdErr.WriteLine "Error - could not get SpVoice object." _ + WScript.StdErr.WriteLine "Error " & Err.Number _ + & " - could not get SpVoice object." _ & " SAPI 5 not installed?" WScript.Quit 1 End If - - If bList Then + + If bList Then ' Just list available voices for the selected language For Each nLangID in LangIDs(sLanguage) sSelectString = "Language=" & Hex(nLangID)