Как отправить запрос на Yandex speechKit синтез речи на node js

Рейтинг: 0Ответов: 2Опубликовано: 06.05.2023

есть 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', ...

В документации вообще ничего нет... Помогите разобраться)

Ответы

▲ 0

Всё оказалось до невозможности просто. Нужно было всё, что мне необходимо передать, перевести в адрес и обязательно не забыть про 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'))
})();

▲ 0
      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)
    })