58 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const BaseEngine = require('../BaseEngine');
 | 
						|
const sdk = require("microsoft-cognitiveservices-speech-sdk");
 | 
						|
const fetch = require('node-fetch');
 | 
						|
 | 
						|
module.exports = class AzureTTS extends BaseEngine {
 | 
						|
    constructor() {
 | 
						|
        super("azure", "Microsoft Azure TTS", "wav");
 | 
						|
        this.voices = {};
 | 
						|
        this.populateVoiceList();
 | 
						|
    }
 | 
						|
 | 
						|
    getDefaultVoice() {
 | 
						|
        return "";
 | 
						|
    }
 | 
						|
 | 
						|
    getSpeechFile(text, filepath, voice = this.getDefaultVoice(), params = {}) {
 | 
						|
        return new Promise((resolve, reject) => {
 | 
						|
            const speechConfig = sdk.SpeechConfig.fromSubscription(process.env.AZURE_API_KEY, process.env.AZURE_REGION);
 | 
						|
            speechConfig.speechSynthesisOutputFormat = sdk.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm;
 | 
						|
            speechConfig.speechSynthesisVoiceName = this.voices[voice];
 | 
						|
            const audioConfig = sdk.AudioConfig.fromAudioFileOutput(filepath);
 | 
						|
            const synthesizer = new sdk.SpeechSynthesizer(speechConfig, audioConfig);
 | 
						|
            synthesizer.speakTextAsync(
 | 
						|
                text,
 | 
						|
                result => {
 | 
						|
                    synthesizer.close();
 | 
						|
                    if (result) {
 | 
						|
                        // return result as stream
 | 
						|
                        resolve(filepath);
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                error => {
 | 
						|
                    console.log(error);
 | 
						|
                    synthesizer.close();
 | 
						|
                    reject(error);
 | 
						|
                });
 | 
						|
        })
 | 
						|
    }
 | 
						|
 | 
						|
    async populateVoiceList() {
 | 
						|
        const opts = {
 | 
						|
            headers: {
 | 
						|
                'Ocp-Apim-Subscription-Key': process.env.AZURE_API_KEY
 | 
						|
            }
 | 
						|
        }
 | 
						|
        const res = await fetch(process.env.AZURE_LIST_ENDPOINT, opts);
 | 
						|
        const json = await res.json();
 | 
						|
        json.forEach((voice) => {
 | 
						|
            if (this.voices[voice.DisplayName]) {
 | 
						|
                if (voice.Name.includes('Neural')) {
 | 
						|
                    this.voices[voice.DisplayName] = voice.ShortName;
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                this.voices[voice.DisplayName] = voice.ShortName;
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
} |