Implement api.output, announcevoice command, a bunch of other tts shit, etc etc etc buh
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -2,3 +2,4 @@ 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); | ||||||
							
								
								
									
										
											BIN
										
									
								
								modules/.DS_Store
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								modules/.DS_Store
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										18
									
								
								modules/ttsSettings/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								modules/ttsSettings/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user