Implement api.output, announcevoice command, a bunch of other tts shit, etc etc etc buh
parent
0fd431d2bc
commit
158ed0372f
|
@ -1,4 +1,5 @@
|
||||||
node_modules
|
node_modules
|
||||||
voice_tmp
|
voice_tmp
|
||||||
.env
|
.env
|
||||||
*.db
|
*.db
|
||||||
|
.ds_store
|
19
index.js
19
index.js
|
@ -27,6 +27,17 @@ const api = {
|
||||||
})
|
})
|
||||||
return engines;
|
return engines;
|
||||||
})(),
|
})(),
|
||||||
|
announcementVoice: process.env.ANNOUNCEMENT_VOICE,
|
||||||
|
announcementEngine: undefined,
|
||||||
|
|
||||||
|
respond: (message, text, voiceText) => {
|
||||||
|
let toSend = message.member.displayName+", "+(voiceText ? voiceText : text);
|
||||||
|
if(message.member.voice.channel) {
|
||||||
|
api.speak(message.member.voice.channel, toSend);
|
||||||
|
} else {
|
||||||
|
message.reply(text);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
isInVoiceChannel: (channel) => {
|
isInVoiceChannel: (channel) => {
|
||||||
return joinedVoiceChannels.includes(channel);
|
return joinedVoiceChannels.includes(channel);
|
||||||
|
@ -59,7 +70,7 @@ const api = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
speak: async (channel, message, engine=api.ttsEngines.gtranslate, voice='en-us', params={}) => {
|
speak: async (channel, message, engine=api.announcementEngine, voice=api.announcementVoice, params={}) => {
|
||||||
const conn = api.getConnectionForVoiceChannel(channel);
|
const conn = api.getConnectionForVoiceChannel(channel);
|
||||||
const filepath = await api.generateVoice(message, engine, voice, params);
|
const filepath = await api.generateVoice(message, engine, voice, params);
|
||||||
if (conn) conn.play(filepath);
|
if (conn) conn.play(filepath);
|
||||||
|
@ -83,15 +94,17 @@ function registerModules() {
|
||||||
|
|
||||||
function handleMessage(message) {
|
function handleMessage(message) {
|
||||||
if (message.content.startsWith(process.env.PREFIX)) {
|
if (message.content.startsWith(process.env.PREFIX)) {
|
||||||
const args = message.contents.split(" ");
|
const args = message.content.split(" ");
|
||||||
const command = args[0].substr(1, args[0].length);
|
const command = args[0].substr(1, args[0].length);
|
||||||
const execution = commandHandlers.get(command);
|
const execution = commandHandlers.get(command);
|
||||||
if (command) {
|
if (command) {
|
||||||
command(args, message);
|
if(execution) execution(args, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
api.announcementEngine = api.ttsEngines[process.env.ANNOUNCEMENT_ENGINE];
|
||||||
registerModules();
|
registerModules();
|
||||||
bot.login(process.env.TOKEN);
|
bot.login(process.env.TOKEN);
|
||||||
bot.on('message', handleMessage);
|
bot.on('message', handleMessage);
|
Binary file not shown.
|
@ -0,0 +1,18 @@
|
||||||
|
module.exports = function(bot, api) {
|
||||||
|
api.registerCommand('announcevoice', (args, message) => {
|
||||||
|
let channel = bot.voice.connections.first().channel;
|
||||||
|
if(args.length>3) {
|
||||||
|
return api.respond(message, "You tried to change my voice with too many arguments.");
|
||||||
|
}
|
||||||
|
if(api.ttsEngines[args[1]]) {
|
||||||
|
api.announcementEngine=api.ttsEngines[args[1]];
|
||||||
|
if(api.announcementEngine.validateVoice(args[2])) {
|
||||||
|
api.announcementVoice=args[2];
|
||||||
|
api.respond(message, "My new voice is "+api.announcementVoice+" from "+api.announcementEngine.longName);
|
||||||
|
} else {
|
||||||
|
api.announcementVoice=api.announcementEngine.getDefaultVoice();
|
||||||
|
api.respond(message, "Your voice name was invalid, so I switched to the default voice ("+api.announcementVoice+") for "+api.announcementEngine.longName+" instead.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
|
@ -5,6 +5,6 @@ module.exports = function(bot, api) {
|
||||||
const channel = await bot.channels.fetch(process.env.CHANNEL);
|
const channel = await bot.channels.fetch(process.env.CHANNEL);
|
||||||
await api.joinChannel(channel);
|
await api.joinChannel(channel);
|
||||||
|
|
||||||
api.speak(channel, `Hi! I'm alive. It is now ${new Date().toLocaleTimeString()} on ${new Date().toLocaleDateString()}`,api.ttsEngines.espeak, "en");
|
api.speak(channel, `Hey buddies! How does it feel like to be a buddy? Are you proud of being a buddy? Well that's great!'`);
|
||||||
})
|
})
|
||||||
}
|
}
|
|
@ -5,7 +5,12 @@ module.exports=class {
|
||||||
this.longName=longName;
|
this.longName=longName;
|
||||||
this.fileExtension=fileExtension;
|
this.fileExtension=fileExtension;
|
||||||
}
|
}
|
||||||
async getSpeech(text, voice, params) {}
|
getInternalVoiceName(str) {
|
||||||
|
return this.voices?this.voices[str]:str;
|
||||||
|
}
|
||||||
|
getDefaultVoice() {}
|
||||||
|
validateVoice(voice) {return this.voices ? this.voices[voice] : true;}
|
||||||
|
async getSpeech(text, voice=this.getDefaultVoice(), params) {}
|
||||||
async getSpeechFile(text, filepath, voice, params) {
|
async getSpeechFile(text, filepath, voice, params) {
|
||||||
const data = await this.getSpeech(text, voice, params);
|
const data = await this.getSpeech(text, voice, params);
|
||||||
const contents = await data.arrayBuffer();
|
const contents = await data.arrayBuffer();
|
||||||
|
|
|
@ -5,7 +5,10 @@ module.exports=class extends BaseEngine {
|
||||||
constructor() {
|
constructor() {
|
||||||
super('ESpeak','wav')
|
super('ESpeak','wav')
|
||||||
}
|
}
|
||||||
async getSpeechFile(text, filepath, voice='en', params={}) {
|
getDefaultVoice() {
|
||||||
|
return 'en';
|
||||||
|
}
|
||||||
|
async getSpeechFile(text, filepath, voice=this.getDefaultVoice(), params={}) {
|
||||||
let proc=await spawn('espeak', ['-v', voice, '-w',filepath, '--stdin']);
|
let proc=await spawn('espeak', ['-v', voice, '-w',filepath, '--stdin']);
|
||||||
proc.stdin.end(text);
|
proc.stdin.end(text);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@ module.exports= class extends BaseEngine {
|
||||||
constructor() {
|
constructor() {
|
||||||
super("Google Translate TTS","mp3");
|
super("Google Translate TTS","mp3");
|
||||||
}
|
}
|
||||||
async getSpeech(text, voice='en-us', params={}) {
|
getDefaultVoice() {
|
||||||
|
return 'en-us';
|
||||||
|
}
|
||||||
|
async getSpeech(text, voice=this.getDefaultVoice(), params={}) {
|
||||||
const url = tts.getAudioUrl(text, {lang: voice});
|
const url = tts.getAudioUrl(text, {lang: voice});
|
||||||
return fetch(url);
|
return fetch(url);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,17 @@ const querystring = require('querystring');
|
||||||
module.exports= class extends BaseEngine {
|
module.exports= class extends BaseEngine {
|
||||||
constructor() {
|
constructor() {
|
||||||
super("IBM Watson TTS","ogg");
|
super("IBM Watson TTS","ogg");
|
||||||
|
this.voices={
|
||||||
|
'Michael': 'en-US_MichaelV3Voice',
|
||||||
|
'Allison': 'en-US_AllisonV3Voice',
|
||||||
|
'Kevin': 'en-US_KevinV3Voice',
|
||||||
|
};
|
||||||
}
|
}
|
||||||
async getSpeech(text, voice='en-us', params={}) {
|
getDefaultVoice() {
|
||||||
const url = process.env.watsonURL+"/v1/synthesize";
|
return 'Michael';
|
||||||
|
}
|
||||||
|
async getSpeech(text, voice=this.getSpeechVoice(), params={}) {
|
||||||
|
const url = process.env.watsonURL+"/v1/synthesize?voice="+this.getInternalVoiceName(voice);
|
||||||
let buff=new Buffer('apikey:'+process.env.watsonAPIKey);
|
let buff=new Buffer('apikey:'+process.env.watsonAPIKey);
|
||||||
let b64auth=buff.toString('base64');
|
let b64auth=buff.toString('base64');
|
||||||
const authorization='Basic '+b64auth;
|
const authorization='Basic '+b64auth;
|
||||||
|
|
Loading…
Reference in New Issue