From 97a7733df9d8817ec2b3613376d7a84b1052502b Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Mon, 9 Jan 2017 11:18:56 -0800 Subject: [PATCH] Use espeak_SetVoiceByName in emscripten glue when only name is provided. --- emscripten/espeakng_glue.cpp | 26 +++++++++++++++++--------- emscripten/espeakng_glue.idl | 2 +- emscripten/js/demo.js | 23 ++++++++++++----------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/emscripten/espeakng_glue.cpp b/emscripten/espeakng_glue.cpp index da2edbb8..d172be33 100644 --- a/emscripten/espeakng_glue.cpp +++ b/emscripten/espeakng_glue.cpp @@ -50,23 +50,31 @@ public: espeak_SetSynthCallback(NULL); } - void set_voice( + long set_voice( const char* aName, - const char* aLang, + const char* aLang=NULL, unsigned char aGender=0, unsigned char aAge=0, unsigned char aVariant = 0 ) { - espeak_VOICE props = { 0 }; - props.name = aName; - props.languages = aLang; - props.gender = aGender; - props.age = aAge; - props.variant = aVariant; + long result = 0; + if (aLang || aGender || aAge || aVariant) { + espeak_VOICE props = { 0 }; + props.name = aName; + props.languages = aLang; + props.gender = aGender; + props.age = aAge; + props.variant = aVariant; + result = espeak_SetVoiceByProperties(&props); + } else { + result = espeak_SetVoiceByName(aName); + } + // This way we don't need to allocate the name/lang strings to the heap. // Instead, we store the actual global voice. - espeak_SetVoiceByProperties(&props); current_voice = espeak_GetCurrentVoice(); + + return result; } int getSizeOfEventStruct_() { diff --git a/emscripten/espeakng_glue.idl b/emscripten/espeakng_glue.idl index 6ea73317..61170b66 100644 --- a/emscripten/espeakng_glue.idl +++ b/emscripten/espeakng_glue.idl @@ -53,7 +53,7 @@ interface eSpeakNGWorker { void eSpeakNGWorker(); void synth_(DOMString aText, VoidPtr aCallback); long getSizeOfEventStruct_(); - void set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0); + long set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0); [Const] attribute espeak_VOICE[] voices; readonly attribute long samplerate; attribute long rate; diff --git a/emscripten/js/demo.js b/emscripten/js/demo.js index 6ff73513..f7482179 100644 --- a/emscripten/js/demo.js +++ b/emscripten/js/demo.js @@ -159,7 +159,7 @@ function speak() { tts.set_pitch(Number(document.getElementById('pitch').value)); console.log(' Setting pitch... done'); console.log(' Setting voice...'); - tts.set_voice.apply(tts, (document.getElementById('voice').value.split(','))); + tts.set_voice(document.getElementById('voice').value); console.log(' Setting voice... done'); var now = Date.now(); @@ -232,16 +232,17 @@ function initializeDemo() { var sel = document.getElementById('voice'); var index = 0; for (voice of result) { - for (lang of voice.languages) { - var opt = document.createElement('option'); - opt.text = voice.name + ' (' + lang.name + ')'; - opt.value = [voice.name, lang.name]; - console.log('Adding voice: ' + opt.text); - sel.add(opt); - if (voice.name === 'default') { - opt.id = 'default-voice'; - opt.selected = true; - } + var opt = document.createElement('option'); + var languages = voice.languages.map(function(lang) { + return lang.name; + }).join(", "); + opt.text = voice.name + ' (' + languages + ')'; + opt.value = voice.identifier; + console.log('Adding voice: ' + opt.text); + sel.add(opt); + if (voice.name === 'default') { + opt.id = 'default-voice'; + opt.selected = true; } } console.log('Leaving cb2');