2007-07-15 18:16:53 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* Module: rbutil
|
|
|
|
* File: tts.cpp
|
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Dominik wenger
|
|
|
|
*
|
|
|
|
* All files in this archive are subject to the GNU General Public License.
|
|
|
|
* See the file COPYING in the source tree root for full license agreement.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "talkfile.h"
|
|
|
|
|
|
|
|
TalkFileCreator::TalkFileCreator()
|
|
|
|
{
|
|
|
|
m_supportedTTS.Add(wxT("espeak"));
|
|
|
|
m_supportedTTSOpts.Add(wxT(""));
|
|
|
|
|
|
|
|
m_supportedEnc.Add(wxT("lame"));
|
|
|
|
m_supportedEncOpts.Add(wxT("--vbr-new -t --nores -S"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TalkFileCreator::initEncoder()
|
|
|
|
{
|
|
|
|
if(::wxFileExists(m_EncExec))
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TalkFileCreator::initTTS()
|
|
|
|
{
|
|
|
|
if(::wxFileExists(m_TTSexec))
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TalkFileCreator::createTalkFiles()
|
|
|
|
{
|
|
|
|
if(!initTTS())
|
|
|
|
{
|
|
|
|
MESG_DIALOG(wxT("Init of TTS engine failed") );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(!initEncoder())
|
|
|
|
{
|
|
|
|
MESG_DIALOG(wxT("Init of encoder failed") );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// enumerate the dirs
|
|
|
|
wxDir talkdir(m_dir);
|
|
|
|
TalkTraverser traverser(this);
|
|
|
|
if(talkdir.Traverse(traverser) == (size_t)-1)
|
|
|
|
return false;
|
|
|
|
else
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TalkFileCreator::voice(wxString text,wxString wavfile)
|
|
|
|
{
|
|
|
|
if(m_curTTS == wxT("espeak"))
|
|
|
|
{
|
|
|
|
wxArrayString out;
|
|
|
|
wxArrayString err;
|
|
|
|
wxExecute(m_TTSexec+wxT(" ")+m_TTSOpts+wxT(" -w \"")+wavfile+wxT("\" \"")+text+wxT("\""),out,err);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MESG_DIALOG(wxT("Unsupported TTS engine") );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TalkFileCreator::encode(wxString input,wxString output)
|
|
|
|
{
|
|
|
|
if(m_curEnc == wxT("lame"))
|
|
|
|
{
|
|
|
|
wxArrayString out;
|
|
|
|
wxArrayString err;
|
|
|
|
wxExecute(m_EncExec+wxT(" ")+m_EncOpts+wxT(" \"")+input+wxT("\" \"")+output+wxT("\""),out,err);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MESG_DIALOG(wxT("Unsupported encoder") );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
wxString TalkFileCreator::getTTsOpts(wxString ttsname)
|
|
|
|
{
|
|
|
|
int index = m_supportedTTS.Index(ttsname);
|
|
|
|
|
|
|
|
return m_supportedTTSOpts[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
wxString TalkFileCreator::getEncOpts(wxString encname)
|
|
|
|
{
|
|
|
|
int index = m_supportedEnc.Index(encname);
|
|
|
|
|
|
|
|
return m_supportedEncOpts[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
wxDirTraverseResult TalkTraverser::OnFile(const wxString& file)
|
|
|
|
{
|
|
|
|
if(file.EndsWith(wxT(".talk")) || file.EndsWith(wxT(".talk.wav")))
|
|
|
|
{
|
|
|
|
return wxDIR_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
wxFileName fname(file);
|
|
|
|
wxString toSpeak;
|
|
|
|
if(m_talkcreator->m_stripExtensions)
|
|
|
|
{
|
|
|
|
toSpeak = fname.GetName();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
toSpeak = fname.GetName()+fname.GetExt();
|
|
|
|
}
|
|
|
|
wxString filename = file+ wxT(".talk");
|
|
|
|
wxString wavname = filename + wxT(".wav");
|
|
|
|
|
|
|
|
if(!wxFileExists(filename) || m_talkcreator->m_overwriteTalk)
|
|
|
|
{
|
|
|
|
if(!wxFileExists(wavname) || m_talkcreator->m_overwriteWav)
|
|
|
|
{
|
|
|
|
if(!m_talkcreator->voice(toSpeak,wavname))
|
|
|
|
{
|
|
|
|
return wxDIR_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!m_talkcreator->encode(wavname,filename))
|
|
|
|
{
|
|
|
|
return wxDIR_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_talkcreator->m_removeWav)
|
|
|
|
{
|
|
|
|
wxRemoveFile(wavname);
|
|
|
|
}
|
|
|
|
|
|
|
|
return wxDIR_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
wxDirTraverseResult TalkTraverser::OnDir(const wxString& dirname)
|
|
|
|
{
|
|
|
|
wxFileName fname(dirname,wxEmptyString);
|
|
|
|
wxArrayString dirs=fname.GetDirs();
|
|
|
|
wxString toSpeak = dirs[dirs.GetCount()-1];
|
|
|
|
|
2007-07-15 22:19:24 +00:00
|
|
|
wxString filename = dirname + wxT("" PATH_SEP "_dirname.talk");
|
2007-07-15 18:16:53 +00:00
|
|
|
wxString wavname = filename + wxT(".wav");
|
|
|
|
|
|
|
|
if(!wxFileExists(filename) || m_talkcreator->m_overwriteTalk)
|
|
|
|
{
|
|
|
|
if(!wxFileExists(wavname) || m_talkcreator->m_overwriteWav)
|
|
|
|
{
|
|
|
|
if(!m_talkcreator->voice(toSpeak,wavname))
|
|
|
|
{
|
|
|
|
return wxDIR_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!m_talkcreator->encode(wavname,filename))
|
|
|
|
{
|
|
|
|
return wxDIR_STOP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_talkcreator->m_removeWav)
|
|
|
|
{
|
|
|
|
wxRemoveFile(wavname);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!m_talkcreator->m_recursive)
|
|
|
|
return wxDIR_IGNORE;
|
|
|
|
else
|
|
|
|
return wxDIR_CONTINUE;
|
|
|
|
}
|