-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspeech.mjs
72 lines (61 loc) · 2.21 KB
/
speech.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { createId } from "@paralleldrive/cuid2";
import sdk from "microsoft-cognitiveservices-speech-sdk";
import { getError, getFailure, getSuccess } from "./results.mjs";
import { getAudioName } from "./common.mjs";
const femaleVoiceName = "vi-VN-HoaiMyNeural";
const maleVoiceName = "vi-VN-NamMinhNeural";
const getVoice = (genderChar) => {
return genderChar === "f" ? femaleVoiceName : maleVoiceName;
};
export const validateGenderChar = (genderChar) => {
return genderChar === "f" || genderChar === "m";
};
export const createAudio = (genderChar, text) => {
return new Promise((resolve, reject) => {
const id = createId();
const audioFileName = getAudioName(genderChar, id);
console.log("createAudio", audioFileName);
console.log(process.env.SPEECH_KEY, process.env.SPEECH_REGION);
if (!process.env.SPEECH_KEY || !process.env.SPEECH_REGION)
reject(getError("Unable to connect to speech server"));
// TODO write id and text to a table somewhere for cache/lookup
try {
// Connect SDK
const speechConfig = sdk.SpeechConfig.fromSubscription(
process.env.SPEECH_KEY,
process.env.SPEECH_REGION
);
const audioConfig = sdk.AudioConfig.fromAudioFileOutput(audioFileName);
speechConfig.speechSynthesisVoiceName = getVoice(genderChar);
// Create the speech synthesizer.
var synthesizer = new sdk.SpeechSynthesizer(speechConfig, audioConfig);
synthesizer.speakTextAsync(
text,
function (result) {
if (result.reason === sdk.ResultReason.SynthesizingAudioCompleted) {
console.log("Synthesis finished.");
} else {
console.error("Speech synthesis canceled, " + result.errorDetails);
}
synthesizer.close();
synthesizer = null;
const resultModel = getSuccess(
audioFileName,
id,
text,
result.resultId
);
resolve(resultModel);
},
function (err) {
synthesizer.close();
synthesizer = null;
const resultModel = getFailure(id, text);
reject(resultModel);
}
);
} catch (error) {
reject(getError(error));
}
});
};