Задать вопрос
chincharovpc
@chincharovpc

SpeechKit API на JS?

Записываю с микрофона в формате .ogg
Функция возвращает мне ссылку на файл типа "blob:https://xn--80aaj5aiiy2b.xn--p1ai/ce8b1088-7f67-45..."

Потом я должен передать по API к Yandex SpeechKit, только не получается передать

Вот и сама функция
function SpeechKit(link) {
    console.log(link);

    var data = null;
    var xhr = new XMLHttpRequest();

    xhr.addEventListener("readystatechange", function () {
        if (this.readyState === 4) {
            console.log(this.responseText);
        }
    });

    xhr.open("POST", "https://stt.api.cloud.yandex.net/speech/v1/stt:recognize",true);
    xhr.setRequestHeader("Authorization", "Api-Key ........");
    xhr.setRequestHeader("Content-Type", "text/plain");
    xhr.setRequestHeader("Accept", "/");
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("Postman-Token", "9d5bfa....");
    xhr.setRequestHeader("cache-control", "no-cache");

    xhr.send(data);
}


Как я должен отправить link через API ?
  • Вопрос задан
  • 1264 просмотра
Подписаться 2 Простой 2 комментария
Решения вопроса 2
chincharovpc
@chincharovpc Автор вопроса
Смог.
  1. Записывается голос с микрофона с помощью WebAudioRecorder, есть в github
  2. Запись преобразуем в blob
  3. blob преобразуем в base64 с помощью FileReader
  4. base64 передаем с помощью POST к php
  5. в php создаем файл из base64 с помощью
    file_put_contents($audioFileName, base64_decode($file));

  6. Открываем файл созданный только что и передаем к Speechkit
  7. Возвращаем ответ

Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
вариант 1 (взят с qaru)

Это возможно только при использовании XHR FormData API (ранее известный как часть XHR2 или XHR Level 2, в настоящее время известный как "Расширенные функции XHR" ).

Учитывая этот HTML,

<input type="file" id="myFileField" name="myFile" />


вы можете загрузить его, как показано ниже:

var formData = new FormData();
formData.append("myFile", document.getElementById("myFileField").files[0]);

var xhr = new XMLHttpRequest();
xhr.open("POST", "myServletUrl");
xhr.send(formData);


XHR позаботится о правильных заголовках и запросит кодирование тела, и файл в этом примере будет доступен на стороне сервера как form-data с именем myFile.

Вам нужно иметь в виду, что API FormData не поддерживается в старых браузерах. В caniuse.com вы можете увидеть, что он в настоящее время реализован в Chrome 7+, Firefox 3.5+, Safari 5+, IE 10+ и Opera 12+.


вариант 2 (взят с qaru)

(более подробное описание fetch API)

// Это базовый пример с комментариями. Функция upload - это то, что вы ищете:

// Select your input type file and store it in a variable
const input = document.getElementById('fileinput');

// This will upload the file after having read it
const upload = (file) => {
  fetch('http://www.example.net', { // Your POST endpoint
    method: 'POST',
    headers: {
      // Content-Type may need to be completely **omitted**
      // or you may need something
      "Content-Type": "You will perhaps need to define a content-type here"
    },
    body: file // This is your file object
  }).then(
    response => response.json() // if the response is a JSON object
  ).then(
    success => console.log(success) // Handle the success response object
  ).catch(
    error => console.log(error) // Handle the error response object
  );
};

// Event handler executed when a file is selected
const onSelectFile = () => upload(input.files[0]);

// Add a listener on your input
// It will be triggered when a file will be selected
input.addEventListener('change', onSelectFile, false);




ЗЫ: не забудьте указать правильные параметры аудиофайла
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы