Я пытаюсь воспроизвести аудиофайл с бинарным строковым форматом, который возвращает Amazon Polly. Для этого я использую "response-native-fetch-blob" и чтение потока, но просто продолжаю получать ошибки с моста, говоря "Недопустимое сообщение данных - все должно быть длиной: 8". Это происходит, когда я пытаюсь открыть поток: ifstream.open()
Это код:
//polly config
const params = {
LexiconNames: [],
OutputFormat: "mp3",
SampleRate: "8000",
Text: "All Gaul is divided into three parts",
TextType: "text",
VoiceId: "Joanna"
};
Polly.synthesizeSpeech(params, function(err, data) {
let _data = "";
RNFetchBlob.fs.readStream(
// file path
data.AudioStream,
// encoding, should be one of 'base64', 'utf8', 'ascii'
'ascii'
)
.then((ifstream) => {
ifstream.open()
ifstream.onData((chunk) => {
_data += chunk
})
ifstream.onError((err) => {
console.log('oops', err.toString())
})
ifstream.onEnd(() => {
//pasing _data to streaming player or normal audio player
ReactNativeAudioStreaming.play(_data, {showIniOSMediaCenter: true, showInAndroidNotifications: true});
})
})
});
Другое решение, которое я также попытался, заключается в том, чтобы сохранить поток в файл, чтобы загрузить его позже, но у меня были похожие ошибки. RNFetchBlob.fs.createFile("myfile.mp3", dataG.AudioStream, 'ascii');
Огромное спасибо заранее
Вы можете использовать метод getSynthesizeSpeechUrl из AWS.Polly.Presigner. Я делаю это и использую реакцию-родной звук для воспроизведения mp3. Я столкнулся с проблемой, когда mp3 не играл, потому что мой назначенный URL содержал специальные символы, но здесь исправление.
Вы можете использовать fetch()
для запроса одного или нескольких медиаресурсов, вернуть Response.body.getReader()
из .then()
чтобы получить ReadableStream
ответа. Прочитайте значения Uint8Array
возвращаемые как поток, как прочитанные с .read()
метода .read()
ReadableStream
, добавьте значение в SourceBuffer
из MediaSource
для потоковой передачи медиафайлов в HTMLMediaElement
.
Например, для вывода звука двух запрошенных аудиоресурсов в последовательности
window.addEventListener("load", () => {
const audio = document.createElement("audio");
audio.controls = "controls";
document.body.appendChild(audio);
audio.addEventListener("canplay", e => {
audio.play();
});
const words = ["hello", "world"];
const mediaSource = new MediaSource();
const mimeCodec = "audio/mpeg";
const mediaType = ".mp3";
const url = "https://ssl.gstatic.com/dictionary/static/sounds/de/0/";
Promise.all(
words.map(word =>
fetch('https://query.yahooapis.com/v1/public/yql?q=select * from data.uri where url="${url}${word}${mediaType}"&format=json&callback=')
.then(response => response.json())
.then(({
query: {
results: {
url
}
}
}) =>
fetch(url).then(response => response.body.getReader())
.then(readers => readers)
)
)
)
.then(readers => {
audio.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", sourceOpen);
async function sourceOpen() {
var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
// set 'sourceBuffer' '.mode' to '"sequence"'
sourceBuffer.mode = "segments";
const processStream = ({
done,
value
}) => {
if (done) {
return;
}
// append chunk of stream to 'sourceBuffer'
sourceBuffer.appendBuffer(value);
}
// at 'sourceBuffer' 'updateend' call 'reader.read()',
// to read next chunk of stream, append chunk to
// 'sourceBuffer'
for (let [index, reader] of Object.entries(readers)) {
sourceBuffer.addEventListener("updateend", function() {
reader.read().then(processStream);
});
let stream = await reader.read().then(processStream)
.then(() => reader.closed)
.then(() => "done reading stream " + index);
console.log(stream);
}
}
})
})
SourceBuffer
и поддержки Uint8Array
_data
? Можете ли вы указать полный путь к аудиофайлу в вопросе?Blob
объект, если вы ожидаете прочитать потокUint8Array
в виде фрагментов?