import ARI from 'ari-client'; import { randomBytes } from 'crypto'; import { promises as fs } from 'fs'; import { PBX } from '../../class'; export default class Misc { public static accessDenied(channel: ARI.Channel) { return new Promise((resolve, reject) => { channel.play({ media: 'sound:access-denied', }, undefined).then((playback) => { playback.on('PlaybackFinished', () => { channel.hangup().catch((err) => reject(err)); resolve(); }); }).catch((err) => reject(err)); }); } public static async TTS(pbx: PBX, text: string, gender: string | any): Promise { const fileExtension = `${randomBytes(10).toString('hex')}`; const [response] = await pbx.tts.synthesizeSpeech({ input: { text }, voice: { languageCode: 'en-US', ssmlGender: gender }, audioConfig: { audioEncoding: 'OGG_OPUS' }, }); await fs.writeFile(`/tmp/${fileExtension}.ogg`, response.audioContent, 'binary'); await pbx.client.util.exec(`ffmpeg -i /tmp/${fileExtension}.ogg -af "highpass=f=300, lowpass=f=3400" -ar 8000 -ac 1 -ab 64k -f mulaw /tmp/${fileExtension}.ulaw`); return `sound:/tmp/${fileExtension}`; } public static play(pbx: PBX, channel: ARI.Channel, sound: string | string[]): Promise { const playback = pbx.ari.Playback(); return new Promise((resolve, reject) => { playback.once('PlaybackFinished', (_, pl: ARI.Playback) => { resolve(pl); }); channel.play({ media: sound }, playback).catch((err) => reject(err)); }); } }