#azure #rest #express #azure-cognitive-services #arraybuffer
Вопрос:
Я пытаюсь выяснить, как предоставить экспресс-маршрут (т. Е.: Получить api/word/:some_word), который использует пакет sdk azure tts (microsoft-cognitiveservices-speech-sdk) для создания аудиоверсии some_word (в любом формате, воспроизводимом браузером), и res.send () с полученным звуком, чтобы интерфейсное веб-приложение javascript могло использовать api для воспроизведения звукового произношения слова.
У меня «работает» azure sdk — он создает «ArrayBuffer» внутри моего кода expressjs. Однако я не знаю, как отправить данные в этом буфере массива на внешний интерфейс. Я следовал инструкциям здесь: https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/get-started-text-to-speech?tabs=import,windowsinstallamp;pivots=programming-language-javascript#get-result-as-an-in-memory-stream
Другим способом сформулировать мой вопрос было бы: «В express у меня есть ArrayBuffer, содержимое которого представляет собой файл .mp3/.ogg/.wav. Как мне отправить этот файл экспресс-почтой? Нужно ли мне конвертировать его в какой-то другой тип данных(например, строку в кодировке Base64? Буфер?) Нужно ли мне устанавливать какие-то конкретные заголовки ответов?
Ответ №1:
Я, наконец, понял это через несколько секунд после того, как задал этот вопрос 😂
Я довольно новичок в этой области, поэтому буду признателен за любые указания о том, как это можно улучшить.
app.get('/api/tts/word/:word', async (req, res) => {
const word = req.params.word;
const subscriptionKey = azureKey;
const serviceRegion = 'australiaeast';
const speechConfig = sdk.SpeechConfig.fromSubscription(
subscriptionKey as string,
serviceRegion
);
speechConfig.speechSynthesisOutputFormat =
SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus;
const synthesizer = new sdk.SpeechSynthesizer(speechConfig);
synthesizer.speakSsmlAsync(
`
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice name="zh-CN-XiaoxiaoNeural">
${word}
</voice>
</speak>
`,
(resp) => {
const audio = resp.audioData;
synthesizer.close();
const buffer = Buffer.from(audio);
res.set('Content-Type', 'audio/ogg; codecs=opus; rate=24000');
res.send(buffer);
}
);
});