var Speech = (function() {
|
|
|
|
var answerFinal = "";
|
|
var playing = "";
|
|
|
|
function init(settings){
|
|
//No Initialization as of now.
|
|
document.getElementById('speaklang').innerHTML = settings.language;
|
|
meSpeak.loadConfig("mespeak_config.json");
|
|
loadVoice(settings.language);
|
|
}
|
|
|
|
function getBotReply(question){
|
|
var aimlInterpreter = new AIMLInterpreter({name:'WireInterpreter', age:'42'});
|
|
var filesArray = ['js/alice/star.aiml'];
|
|
var words = question.split(' ');
|
|
var marked = new Array(256);
|
|
for(i=0;i<256;i++){
|
|
marked[i] = 0;
|
|
}
|
|
for(i=0; i<words.length; i++){
|
|
if(words[i][0] >= 'a' && words[i][0] <= 'z'){
|
|
if (marked[(words[i].charCodeAt(0)+'A'.charCodeAt(0)-'a'.charCodeAt(0))] == 0){
|
|
marked[(words[i].charCodeAt(0)+'A'.charCodeAt(0)-'a'.charCodeAt(0))] = 1;
|
|
filesArray.unshift("js/alice/" + String.fromCharCode(words[i].charCodeAt(0)+'A'.charCodeAt(0)-'a'.charCodeAt(0)) + ".aiml");
|
|
}
|
|
}
|
|
if((words[i][0] >= 'A' && words[i][0] <= 'Z') || (words[i][0] >= '0' && words[i][0] <= '9')){
|
|
if (marked[words[i].charCodeAt(0)] == 0){
|
|
marked[words[i].charCodeAt(0)] = 1;
|
|
filesArray.unshift("js/alice/" + words[i][0] + ".aiml");
|
|
}
|
|
}
|
|
}
|
|
//console.log(filesArray);
|
|
aimlInterpreter.loadAIMLFilesIntoArray(filesArray);
|
|
answerFinal = "Please ask me something else";
|
|
|
|
var callback = function(answer, wildCardArray, input){
|
|
if(answer == null){
|
|
answer = "Please ask me something else";
|
|
}
|
|
answerFinal = answer.split('.')[0];
|
|
};
|
|
|
|
aimlInterpreter.findAnswerInLoadedAIMLFiles(question, callback);
|
|
}
|
|
|
|
function testVoice(voice, callback) {
|
|
var req=new XMLHttpRequest();
|
|
req.url = voice;
|
|
try {
|
|
req.open('GET', voice);
|
|
req.onreadystatechange=function() {
|
|
if (req.readyState==4) {
|
|
callback((req.status==200 || req.status==0) && req.response.length > 0);
|
|
}
|
|
};
|
|
req.send('');
|
|
}
|
|
catch(e) {
|
|
callback(false);
|
|
}
|
|
}
|
|
|
|
function loadVoice(name, callback) {
|
|
var defaultVoice = meSpeak.getDefaultVoice();
|
|
if (defaultVoice == name || defaultVoice.indexOf(name) == 0) {
|
|
if (callback) callback();
|
|
return;
|
|
}
|
|
var fname = "voices/"+name+".json";
|
|
testVoice(fname, function(exist) {
|
|
if (exist) {
|
|
meSpeak.loadVoice(fname, callback);
|
|
} else {
|
|
document.getElementById('speaklang').innerHTML = "en";
|
|
meSpeak.loadVoice("voices/en.json", callback);
|
|
}
|
|
});
|
|
}
|
|
|
|
hiddenArray(); // Access speakArray
|
|
|
|
// Function containing the speakArray, which saves the recent talk array
|
|
function hiddenArray() {
|
|
speakArray = [];
|
|
}
|
|
|
|
function playVoice(language, text) {
|
|
playing = text;
|
|
|
|
//Adds option when text is spoken
|
|
var addUserInput = document.createElement("OPTION");
|
|
addUserInput.setAttribute("value", playing);
|
|
addUserInput.text = playing;
|
|
document.getElementById("combo-box").appendChild(addUserInput);
|
|
document.getElementById("combo-box").value= playing;
|
|
|
|
speakArray.push(playing); // Adds recent talks to speakArray
|
|
|
|
if(document.getElementById('mode').innerHTML=="2"){
|
|
//After the voice is loaded, playSound callback is called
|
|
getBotReply(text);
|
|
setTimeout(function(){
|
|
loadVoice(language, playSound);
|
|
}, 4000);
|
|
}
|
|
else{
|
|
loadVoice(language, playSound);
|
|
}
|
|
}
|
|
|
|
|
|
function playSound(){
|
|
var text = playing;
|
|
var pitch = document.getElementById('pitch').innerHTML;
|
|
var speed = document.getElementById('rate').innerHTML;
|
|
if(document.getElementById('mode').innerHTML=="2"){
|
|
text = answerFinal;
|
|
console.log(answerFinal);
|
|
}
|
|
|
|
function soundComplete(){
|
|
document.getElementById('speaking').innerHTML = "0";
|
|
}
|
|
|
|
if (!/iPad|iPhone/.test(navigator.userAgent)) {
|
|
meSpeak.speak(text, {speed: speed, pitch: pitch}, soundComplete);
|
|
} else {
|
|
// HACK: On iOS, need to be played into an HTMLAudio control
|
|
var myDataUrl = meSpeak.speak(text, {speed: speed, pitch: pitch, rawdata: 'data-url'}, soundComplete);
|
|
var sound = new Audio(myDataUrl);
|
|
sound.addEventListener("ended", function(){
|
|
document.getElementById('speaking').innerHTML = "0";
|
|
});
|
|
sound.play();
|
|
}
|
|
}
|
|
|
|
return {
|
|
init: init,
|
|
playVoice: playVoice
|
|
};
|
|
|
|
});
|