00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef EKHO_H
00018 #define EKHO_H
00019
00020 #include <queue>
00021 #include <pthread.h>
00022 #include <sndfile.h>
00023 #include "config.h"
00024 #include "ekho_dict.h"
00025
00026 #if HAVE_PULSEAUDIO
00027 #include <pulse/simple.h>
00028 #include <pulse/error.h>
00029 #endif
00030
00031 #ifdef ENABLE_SOUNDTOUCH
00032 #include "SoundTouch.h"
00033 using namespace soundtouch;
00034 #else
00035 #include "sonic.h"
00036 #endif
00037
00038 using namespace std;
00039
00040 namespace ekho {
00041
00042 typedef struct {
00043 string text;
00044 void (*pCallback)(void*);
00045 void* pCallbackArgs;
00046 } SpeechOrder;
00047
00048 enum Command {
00049 SPEAK,
00050 SAVEMP3,
00051 SAVEOGG,
00052 GETPHONSYMBOLS
00053 };
00054
00055 class Ekho {
00056 public:
00057 const static int BUFFER_SIZE = 8192;
00058 const static int MAX_CLIENTS = 100;
00059 Dict mDict;
00060 int mPort;
00061
00062 static void debug(bool flag = true) {
00063 mDebug = flag;
00064 Dict::mDebug = flag;
00065 };
00066
00067 Ekho(void);
00068 Ekho(string voice);
00069
00070
00071
00072 ~Ekho(void);
00073
00074
00075
00076
00077
00078
00079
00080 int setVoice(string voice);
00081
00082 string getVoice(void);
00083
00084
00085
00086
00087
00088 int speak(string text,
00089 void (*pCallback)(void*) = NULL,
00090 void* pCallbackArgs = NULL);
00091
00092
00093
00094
00095 int blockSpeak(string text);
00096
00097
00098 int play(string file);
00099
00100
00101 int saveWav(string text, string filename);
00102
00103
00104 int saveOgg(string text, string filename);
00105
00106
00107 int saveMp3(string text, string filename);
00108
00109
00110 int pause(void);
00111
00112
00113 int resume(void);
00114
00115
00116 int stop(void);
00117
00118
00119 int startServer(int port);
00120
00121
00122 int request(string ip, int port, Command cmd, string text, string outfile);
00123
00124
00125
00126
00127
00128
00129 void setSpeed(int tempo_delta);
00130 int getSpeed(void);
00131
00132
00133
00134
00135
00136
00137 void setPitch(int pitch_delta);
00138 int getPitch(void);
00139
00140
00141
00142
00143
00144
00145 void setVolume(int volume_delta);
00146 int getVolume(void);
00147
00148
00149
00150
00151
00152
00153
00154 void setRate(int rate_delta);
00155 int getRate(void);
00156
00157 string genTempFilename(void);
00158
00159 #ifdef ENABLE_SOUNDTOUCH
00160 SoundTouch pSoundtouch;
00161 #else
00162 sonicStream mSonicStream;
00163 #endif
00164
00165 static void* speechDaemon(void *args);
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 const char* getPcmFromFestival(string text, int& size);
00176
00177 private:
00178 int init(void);
00179 int initPcm(void);
00180 int initSound(void);
00181 int initStream(void);
00182 int initFestival(void);
00183 void closeStream(void);
00184 int outputSpeech(Ekho *pEkho, string text);
00185
00186 static bool mDebug;
00187 int tempoDelta;
00188 int pitchDelta;
00189 int volumeDelta;
00190 int rateDelta;
00191
00192 bool isRecording;
00193 bool isPaused;
00194 bool isStopped;
00195 bool isEnded;
00196 bool isSoundInited;
00197 string player;
00198 SNDFILE *pWavFile;
00199 queue<SpeechOrder> speechQueue;
00200
00201 bool isSpeechThreadInited;
00202 pthread_t speechThread;
00203 #ifdef HAVE_PULSEAUDIO
00204 pa_simple *stream;
00205 #endif
00206 };
00207 }
00208 #endif