Как отправить запрос на Yandex speechKit синтез речи на node js
есть json по которому я хочу достучаться до синтеза речи Yandex SpeechKit text.json
{
"text": "Привет, братишка, хочу поздравить тебя с твоим гейским праздником",
"lang": "ru",
"emotion": "ermil",
"format": "mp3",
}
Я отправляю запрос через nodeJS Axios на const api = https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize
const req = fs.createReadStream('./text.json');
(async ()=>{
const result = await axios({
method: "POST",
url: api,
headers: {
"Transfer-Encoding": "chunked",
'Authorization': 'Api-Key ' + YA_API_KEY
},
data: JSON.parse(fs.readFileSync('./text.json'))
})
result.data.pipe(fs.createWriteStream('./what.mp3'))
})();
Поверьте, это не единственная вариация кода, которую я использовал
const chunks = [];
req.on('data', chunk => chunks.push(chunk))
req.on('end', async () => {
const axiosConfig = {
method: 'POST',
url: api,
headers: {
"Transfer-Encoding": "chunked",
'Authorization': `Bearer ${YA_API_KEY}`
},
data: Buffer.concat(chunks)
}
axios(axiosConfig).then(res => console.log(res.data))
})
Также я пробовал передавать text.json - utf8. Ничего не выходит, выдаёт ошибку 400
AxiosError: Request failed with status code 400
at settle (C:\Users\User\Desktop\test\node_modules\axios\dist\node\axios.cjs:1909:12)
at IncomingMessage.handleStreamEnd (C:\Users\User\Desktop\test\node_modules\axios\dist\node\axios.cjs:2989:11)
at IncomingMessage.emit (node:events:525:35)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
code: 'ERR_BAD_REQUEST', ...
В документации вообще ничего нет... Помогите разобраться)
Ответы (2 шт):
Автор решения: AlexPapa
→ Ссылка
Всё оказалось до невозможности просто. Нужно было всё, что мне необходимо передать, перевести в адрес и обязательно не забыть про responseType: 'stream'
const params = new URLSearchParams();
const text = 'Привет, сосочка-девочка'
params.append('text', text);
params.append('lang', 'ru-RU');
params.append('voice', 'ermil');
params.append('format', 'mp3');
params.append('emotion', 'good');
params.append('speed', '1.0');
(async () =>{
const result = await axios ({
method: 'POST',
url: api,
responseType: 'stream',
headers: {
Authorization: "Api-Key " + YA_API_KEY,
},
data: params
})
result.data.pipe(fs.createWriteStream('./newFile.mp3'))
})();
Автор решения: Dmiitriy Vasiiliev
→ Ссылка
axios.post(
`https://tts.api.cloud.yandex.net:443/tts/v3/utteranceSynthesis`,
{
"text": text.substring(0,254),
"hints": [
{
"voice": "marina"
},
{
"role": "friendly"
}
]
},
{
headers: {
'Authorization': `Bearer ${tokenObject.iamToken}`,
'x-folder-id': `${folderId}`,
}
}
).then(data => {
const wavBuffer = Buffer.from(data.data?.result?.audioChunk?.data, 'base64');
fs.writeFile('./output.wav', wavBuffer, (err) => {
if (err) {
console.error('Ошибка при записи WAV-файла:', err);
} else {
console.log('WAV-файл успешно сохранён:', filePath);
}
});
const pcm =wavBuffer.subarray(44)
})