1 /* 2 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 /** 17 * @file picoapi.h 18 * 19 * SVOX Pico application programming interface 20 * (SVOX Pico version 1.0 and later) 21 * 22 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 23 * All rights reserved. 24 * 25 * History: 26 * - 2009-04-20 -- initial version 27 */ 28 29 30 /** 31 * @addtogroup picoapi 32 * 33 @b Basic_Concepts 34 35 @e SVOX_Pico_System 36 37 The SVOX Pico 'system' is the entity that manages data common to all 38 SVOX Pico engines, e.g. linguistic data needed to do text-to-speech 39 (TTS) synthesis, license key, etc. All API functions on the Pico 40 system level take a 'pico_System' handle as the first parameter. 41 42 @e SVOX_Pico_Engine 43 44 A SVOX Pico 'engine' provides the functions needed to perform actual 45 synthesis. Currently there can be only one engine instance at a time 46 (concurrent engines will be possible in the future). All API functions 47 at the engine level take a 'pico_Engine' handle as the first 48 parameter. 49 50 @e SVOX_Pico_Resource 51 52 A SVOX Pico 'resource' denotes all the language- and speaker-dependent 53 data needed to do TTS synthesis. In the following, the term 'resource' 54 may be used interchangeably with the term 'lingware'. A resource file 55 contains a set of knowledge bases for an entire TTS voice or parts of 56 it. 57 58 59 @b Basic_Usage 60 61 In its most basic form, an application must call the following 62 functions in order to perform TTS synthesis: 63 64 - pico_initialize 65 - pico_loadResource 66 - pico_createVoiceDefinition 67 - pico_addResourceToVoiceDefinition 68 - pico_newEngine 69 - pico_putTextUtf8 70 - pico_getData (several times) 71 - pico_disposeEngine 72 - pico_releaseVoiceDefinition 73 - pico_unloadResource 74 - pico_terminate 75 76 It is possible to repeatedly run the above sequence, i.e., the SVOX 77 Pico system may be initialized and terminated multiple times. This may 78 be useful in applications that need TTS functionality only from time 79 to time. 80 81 82 @b Conventions 83 84 @e Function_arguments 85 86 All arguments that only return values are marked by a leading 'out...' 87 in their name. All arguments that are used as input and output values 88 are marked by a leading 'inout...'. All other arguments are read-only 89 (input) arguments. 90 91 @e Error_handling 92 93 All API functions return a status code which is one of the status 94 constants defined in picodefs.h. In case of an error, a more detailed 95 description of the status can be retrieved by calling function 96 'pico_getSystemStatusMessage' (or 'pico_getEngineStatusMessage' 97 if the error happened on the SVOX Pico engine level). 98 99 Unlike errors, warnings do not prevent an API function from performing 100 its function, but output might not be as intended. Functions 101 'pico_getNrSystemWarnings' and 'pico_getNrEngineWarnings' respectively 102 can be used to determine whether an API function caused any 103 warnings. Details about warnings can be retrieved by calling 104 'pico_getSystemWarning' and 'pico_getEngineWarning' respectively. 105 106 */ 107 108 109 110 #ifndef PICOAPI_H_ 111 #define PICOAPI_H_ 112 113 114 115 #include "picodefs.h" 116 117 #ifdef __cplusplus 118 extern "C" { 119 #endif 120 #if 0 121 } 122 #endif 123 124 125 #ifdef _WIN32 126 # define PICO_EXPORT __declspec( dllexport ) 127 #else 128 # define PICO_EXPORT extern 129 #endif 130 131 #define PICO_FUNC PICO_EXPORT pico_Status 132 133 134 135 /* ********************************************************************/ 136 /* PICO data types */ 137 /* ********************************************************************/ 138 139 /* Handle types (opaque) for Pico system, resource, engine ************/ 140 141 typedef struct pico_system *pico_System; 142 typedef struct pico_resource *pico_Resource; 143 typedef struct pico_engine *pico_Engine; 144 145 146 /* Signed/unsigned integer data types *********************************/ 147 148 #define PICO_INT16_MAX 32767 149 #define PICO_UINT16_MAX 0xffff 150 #define PICO_INT32_MAX 2147483647 151 #define PICO_UINT32_MAX 0xffffffff 152 153 #include <limits.h> 154 155 #if (SHRT_MAX == PICO_INT16_MAX) 156 typedef short pico_Int16; 157 #else 158 #error "platform not supported" 159 #endif 160 161 #if (USHRT_MAX == PICO_UINT16_MAX) 162 typedef unsigned short pico_Uint16; 163 #else 164 #error "platform not supported" 165 #endif 166 167 #if (INT_MAX == PICO_INT32_MAX) 168 typedef int pico_Int32; 169 #else 170 #error "platform not supported" 171 #endif 172 173 #if (UINT_MAX == PICO_UINT32_MAX) 174 typedef unsigned int pico_Uint32; 175 #else 176 #error "platform not supported" 177 #endif 178 179 180 /* Char data type *****************************************************/ 181 182 typedef unsigned char pico_Char; 183 184 185 /* String type to be used when ASCII string values are returned *******/ 186 187 #define PICO_RETSTRINGSIZE 200 /* maximum length of returned strings */ 188 189 typedef char pico_Retstring[PICO_RETSTRINGSIZE]; 190 191 192 193 /* ********************************************************************/ 194 /* System-level API functions */ 195 /* ********************************************************************/ 196 197 /* System initialization and termination functions ********************/ 198 199 /** 200 Initializes the Pico system and returns its handle in 'outSystem'. 201 'memory' and 'size' define the location and maximum size of memory 202 in number of bytes that the Pico system will use. The minimum size 203 required depends on the number of engines and configurations of 204 lingware to be used. No additional memory will be allocated by the 205 Pico system. This function must be called before any other API 206 function is called. It may only be called once (e.g. at application 207 startup), unless a call to 'pico_terminate'. 208 */ 209 PICO_FUNC pico_initialize( 210 void *memory, 211 const pico_Uint32 size, 212 pico_System *outSystem 213 ); 214 215 /** 216 Terminates the Pico system. Lingware resources still being loaded 217 are unloaded automatically. The memory area provided to Pico in 218 'pico_initialize' is released. The system handle becomes 219 invalid. It is not allowed to call this function as long as Pico 220 engine instances are existing. No API function may be called after 221 this function, except for 'pico_initialize', which reinitializes 222 the system. 223 */ 224 PICO_FUNC pico_terminate( 225 pico_System *system 226 ); 227 228 229 /* System status and error/warning message retrieval ******************/ 230 231 /** 232 Returns in 'outMessage' a description of the system status or of an 233 error that occurred with the most recently called system-level API 234 function. 235 */ 236 PICO_FUNC pico_getSystemStatusMessage( 237 pico_System system, 238 pico_Status errCode, 239 pico_Retstring outMessage 240 ); 241 242 /** 243 Returns in 'outNrOfWarnings' the number of warnings that occurred 244 with the most recently called system-level API function. 245 */ 246 PICO_FUNC pico_getNrSystemWarnings( 247 pico_System system, 248 pico_Int32 *outNrOfWarnings 249 ); 250 251 /** 252 Returns in 'outMessage' a description of a warning that occurred 253 with the most recently called system-level API function. 254 'warningIndex' must be in the range 0..N-1 where N is the number of 255 warnings returned by 'pico_getNrSystemWarnings'. 'outCode' returns 256 the warning as an integer code (cf. PICO_WARN_*). 257 */ 258 PICO_FUNC pico_getSystemWarning( 259 pico_System system, 260 const pico_Int32 warningIndex, 261 pico_Status *outCode, 262 pico_Retstring outMessage 263 ); 264 265 266 /* Resource loading and unloading functions ***************************/ 267 268 /** 269 Loads a resource file into the Pico system. The number of resource 270 files loaded in parallel is limited by PICO_MAX_NUM_RESOURCES. 271 Loading of a resource file may be done at any time (even in 272 parallel to a running engine doing TTS synthesis), but with the 273 general restriction that functions taking a system handle as their 274 first argument must be called in a mutually exclusive fashion. The 275 loaded resource will be available only to engines started after the 276 resource is fully loaded, i.e., not to engines currently 277 running. 278 */ 279 PICO_FUNC pico_loadResource( 280 pico_System system, 281 const pico_Char *resourceFileName, 282 pico_Resource *outResource 283 ); 284 285 /** 286 Unloads a resource file from the Pico system. If no engine uses the 287 resource file, the resource is removed immediately and its 288 associated internal memory is released, otherwise 289 PICO_EXC_RESOURCE_BUSY is returned. 290 */ 291 PICO_FUNC pico_unloadResource( 292 pico_System system, 293 pico_Resource *inoutResource 294 ); 295 296 /* *** Resource inspection functions *******************************/ 297 298 /** 299 Gets the unique resource name of a loaded resource 300 */ 301 PICO_FUNC pico_getResourceName( 302 pico_System system, 303 pico_Resource resource, 304 pico_Retstring outName); 305 306 307 /* Voice definition ***************************************************/ 308 309 /** 310 Creates a voice definition. Resources must be added to the created 311 voice with 'pico_addResourceToVoiceDefinition' before using the 312 voice in 'pico_newEngine'. It is an error to create a voice 313 definition with a previously defined voice name. In that case use 314 'pico_releaseVoiceName' first. 315 */ 316 PICO_FUNC pico_createVoiceDefinition( 317 pico_System system, 318 const pico_Char *voiceName 319 ); 320 321 /** 322 Adds a mapping pair ('voiceName', 'resourceName') to the voice 323 definition. Multiple mapping pairs can added to a voice defintion. 324 When calling 'pico_newEngine' with 'voiceName', the corresponding 325 resources from the mappings will be used with that engine. */ 326 327 PICO_FUNC pico_addResourceToVoiceDefinition( 328 pico_System system, 329 const pico_Char *voiceName, 330 const pico_Char *resourceName 331 ); 332 333 334 /** 335 Releases the voice definition 'voiceName'. 336 337 */ 338 PICO_FUNC pico_releaseVoiceDefinition( 339 pico_System system, 340 const pico_Char *voiceName 341 ); 342 343 344 /* Engine creation and deletion functions *****************************/ 345 346 /** 347 Creates and initializes a new Pico engine instance and returns its 348 handle in 'outEngine'. Only one instance per system is currently 349 possible. 350 */ 351 PICO_FUNC pico_newEngine( 352 pico_System system, 353 const pico_Char *voiceName, 354 pico_Engine *outEngine 355 ); 356 357 358 /** 359 Disposes a Pico engine and releases all memory it occupied. The 360 engine handle becomes invalid. 361 */ 362 PICO_FUNC pico_disposeEngine( 363 pico_System system, 364 pico_Engine *inoutEngine 365 ); 366 367 368 369 /* ********************************************************************/ 370 /* Engine-level API functions */ 371 /* ********************************************************************/ 372 373 /** 374 Puts text 'text' encoded in UTF8 into the Pico text input buffer. 375 'textSize' is the maximum size in number of bytes accessible in 376 'text'. The input text may also contain text-input commands to 377 change, for example, speed or pitch of the resulting speech 378 output. The number of bytes actually copied to the Pico text input 379 buffer is returned in 'outBytesPut'. Sentence ends are 380 automatically detected. '\0' characters may be embedded in 'text' 381 to finish text input or separate independently to be synthesized 382 text parts from each other. Repeatedly calling 'pico_getData' will 383 result in the content of the text input buffer to be synthesized 384 (up to the last sentence end or '\0' character detected). To empty 385 the internal buffers without finishing synthesis, use the function 386 'pico_resetEngine'. 387 */ 388 PICO_FUNC pico_putTextUtf8( 389 pico_Engine engine, 390 const pico_Char *text, 391 const pico_Int16 textSize, 392 pico_Int16 *outBytesPut 393 ); 394 395 /** 396 Gets speech data from the engine. Every time this function is 397 called, the engine performs, within a short time slot, a small 398 amount of processing its input text, and then gives control back to 399 the calling application. Ie. after calling 'pico_putTextUtf8' 400 (incl. a final embedded '\0'), this function needs to be called 401 repeatedly till 'outBytesReceived' bytes are returned in 402 'outBuffer'. The type of data returned in 'outBuffer' (e.g. 8 or 16 403 bit PCM samples) is returned in 'outDataType' and depends on the 404 lingware resources. Possible 'outDataType' values are listed in 405 picodefs.h (PICO_DATA_*). 406 This function returns PICO_STEP_BUSY while processing input and 407 producing speech output. Once all data is returned and there is no 408 more input text available in the Pico text input buffer, 409 PICO_STEP_IDLE is returned. All other function return values 410 indicate a system error. 411 */ 412 PICO_FUNC pico_getData( 413 pico_Engine engine, 414 void *outBuffer, 415 const pico_Int16 bufferSize, 416 pico_Int16 *outBytesReceived, 417 pico_Int16 *outDataType 418 ); 419 420 /** 421 Resets the engine and clears all engine-internal buffers, in 422 particular text input and signal data output buffers. 423 'resetMode' is one of 'PICO_RESET_SOFT', to be used to flush the engine, 424 or 'PICO_RESET_FULL', to reset the engine after an engine error. 425 */ 426 PICO_FUNC pico_resetEngine( 427 pico_Engine engine, 428 pico_Int32 resetMode 429 ); 430 431 432 /* Engine status and error/warning message retrieval ******************/ 433 434 /** 435 Returns in 'outMessage' a description of the engine status or of an 436 error that occurred with the most recently called engine-level API 437 function. 438 */ 439 PICO_FUNC pico_getEngineStatusMessage( 440 pico_Engine engine, 441 pico_Status errCode, 442 pico_Retstring outMessage 443 ); 444 445 /** 446 Returns in 'outNrOfWarnings' the number of warnings that occurred 447 with the most recently called engine-level API function. 448 */ 449 PICO_FUNC pico_getNrEngineWarnings( 450 pico_Engine engine, 451 pico_Int32 *outNrOfWarnings 452 ); 453 454 /** 455 Returns in 'outMessage' a description of a warning that occurred 456 with the most recently called engine-level API function. 457 'warningIndex' must be in the range 0..N-1 where N is the number of 458 warnings returned by 'pico_getNrEngineWarnings'. 'outCode' returns 459 the warning as an integer code (cf. PICO_WARN_*). 460 */ 461 PICO_FUNC pico_getEngineWarning( 462 pico_Engine engine, 463 const pico_Int32 warningIndex, 464 pico_Status *outCode, 465 pico_Retstring outMessage 466 ); 467 468 #ifdef __cplusplus 469 } 470 #endif 471 472 #endif /*PICOAPI_H_*/ 473