Compare commits

...

3 Commits

Author SHA1 Message Date
Hoan Luu Huu 7b4520c070 Playht delete circular buffer with mutex check (#123)
Signed-off-by: root <root@af6633a5cfe8>
Co-authored-by: root <root@af6633a5cfe8>
2024-10-05 10:02:07 -04:00
Lyle Pratt 9f7a06ce56 Update README.md (#9)
Updated ElevenLabs module to include an example of how to use the module as well as links to params in ElevenLabs docs.
2024-10-03 08:06:32 -04:00
Hoan Luu Huu f7f8f52283 fixed google asr max duration exceeded or no audio raised jambonz_transcribe::error (#120)
Co-authored-by: root <root@af6633a5cfe8>
2024-10-03 08:04:40 -04:00
3 changed files with 24 additions and 9 deletions
+17 -9
View File
@@ -1,11 +1,11 @@
# mod_google_tts # mod_google_tts
A Freeswitch module that allows Google Text-to-Speech API to be used as a tts provider. A Freeswitch module that allows Eleven Labs' Text-to-Speech API to be used as a tts provider.
## API ## API
### Commands ### Commands
This freeswitch module does not add any new commands, per se. Rather, it integrates into the Freeswitch TTS interface such that it is invoked when an application uses the mod_dptools `speak` command with a tts engine of `google_tts` and a voice equal to the language code associated to one of the [supported Wavenet voices](https://cloud.google.com/text-to-speech/docs/voices) This freeswitch module does not add any new commands, per se. Rather, it integrates into the Freeswitch TTS interface such that it is invoked when an application uses the mod_dptools `speak` command with a tts engine of `elevenlabs` and a voice equal to the language code associated to one of the [supported Eleven Labs voices](https://elevenlabs.io/docs/api-reference/query-library)
### Events ### Events
None. None.
@@ -13,11 +13,19 @@ None.
## Usage ## Usage
When using [drachtio-fsrmf](https://www.npmjs.com/package/drachtio-fsmrf), you can access this functionality via the speak method on the 'endpoint' object. When using [drachtio-fsrmf](https://www.npmjs.com/package/drachtio-fsmrf), you can access this functionality via the speak method on the 'endpoint' object.
```js ```js
ep.speak({ var text = "Hello World";
ttsEngine: 'google_tts', await endpoint.speak({
voice: 'en-GB-Wavenet-A', "ttsEngine": 'elevenlabs',
text: 'This aggression will not stand' "voice": "W9OIfHh5DtdYiZUcFiql",
}); "text": `{use_speaker_boost=1,optimize_streaming_latency=4,style=0.5,stability=0.5,similarity_boost=0.75,api_key=XXYYZZ,model_id=eleven_turbo_v2}${text}`,
});
``` ```
## Examples ## Options
[google_tts.js](../../examples/google_tts.js)
Documentation on these options can be found in Eleven Labs API docs: [Voice Settings](https://elevenlabs.io/docs/speech-synthesis/voice-settings)
- use_speaker_boost
- optimize_streaming_latency
- style
- stability
- similarity_boost
+4
View File
@@ -233,6 +233,10 @@ static void *SWITCH_THREAD_FUNC grpc_read_thread(switch_thread_t *thread, void *
auto speech_event_type = response.speech_event_type(); auto speech_event_type = response.speech_event_type();
if (response.has_error()) { if (response.has_error()) {
Status status = response.error(); Status status = response.error();
//error 11 is handled in finished session, avoid sending jambonz_transcribe::error event for this here.
if (11 == status.code()) {
continue;
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "grpc_read_thread: error %s (%d)\n", status.message().c_str(), status.code()) ; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "grpc_read_thread: error %s (%d)\n", status.message().c_str(), status.code()) ;
cJSON* json = cJSON_CreateObject(); cJSON* json = cJSON_CreateObject();
cJSON_AddStringToObject(json, "type", "error"); cJSON_AddStringToObject(json, "type", "error");
+3
View File
@@ -959,8 +959,11 @@ extern "C" {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "playht_speech_flush_tts, download complete? %s\n", download_complete ? "yes" : "no") ; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "playht_speech_flush_tts, download complete? %s\n", download_complete ? "yes" : "no") ;
ConnInfo_t *conn = (ConnInfo_t *) p->conn; ConnInfo_t *conn = (ConnInfo_t *) p->conn;
CircularBuffer_t *cBuffer = (CircularBuffer_t *) p->circularBuffer; CircularBuffer_t *cBuffer = (CircularBuffer_t *) p->circularBuffer;
// In multi threads, only delete the circular buffer when write and read buffer action finished using it.
switch_mutex_lock(p->mutex);
delete cBuffer; delete cBuffer;
p->circularBuffer = nullptr ; p->circularBuffer = nullptr ;
switch_mutex_unlock(p->mutex);
if (conn) { if (conn) {
conn->flushed = true; conn->flushed = true;