Próbuję zrobić coś, co moim zdaniem byłoby proste. Używam nwjs (wcześniej nazywanego Node-Webkit), który, jeśli nie wiesz, w zasadzie oznacza, że tworzę aplikację na komputery stacjonarne, używając węzła Chromium &, gdzie DOM jest w tym samym zakresie co węzeł. Chcę odciążyć pracę webworkerowi, aby GUI nie zawiesił się, gdy wyślę trochę tekstu do Ivona Cloud (przy użyciu węzła ivona), który jest API do tekstu na mowę. Dźwięk wraca w porcjach, gdy jest generowany i zapisywany do formatu MP3. ivona-node używa fs do zapisu pliku mp3 na dysk. Mam to działa w dom, ale webworkers są potrzebne, aby nie zawiesić interfejsu użytkownika. Tak więc mam dwa moduły węzłów, które muszę użyć w webworker, ivona-node i fs.Nie można wymagać modułów węzłów w WebWorker (NWJS)
Problem polega na tym, że w przeglądarce sieciowej nie można użyć wymagania. Spróbowałem więc pakować ivona-node i fs z browserify (istnieje pakiet o nazwie browserify-fs do tego, którego użyłem) i zastępuję require z importScripts(). Teraz otrzymuję błędy var w modułach węzła.
Uwaga: Nie sądzę, aby metoda native_fs_ działała na zapisywanie pliku mp3 na dysku w porcjach (The stream), tak jak powinna, i również dostaję błędy w pakiecie Ivona (w rzeczywistości przede wszystkim), że nie wiem jak to naprawić. Załączam wszystkie informacje, aby to odtworzyć.
Oto błąd Dostaję w konsoli: Uncaught SyntaxError: Nieoczekiwany token var ivonabundle.js VM39: 23132
- Kroki prowadzące do odtworzenia w NWJS:
npm instalują Ivona-node
npm zainstalować browserify-FS
KMP zainstalować -g browserify
- Teraz browserified main.js dla Ivona-węzeł i index.js dla browserify-FS:
browserify main.js> ivonabundle.js
browserify index.js> fsbundle.js
package.json ...
{
"name": "appname",
"description": "appdescr",
"title": "apptitle",
"main": "index.html",
"window":
{
"toolbar": true,
"resizable": false,
"width": 800,
"height": 500
},
"webkit":
{
"plugin": true
}
}
index.html ...
<html>
<head>
<title>apptitle</title>
</head>
<body>
<p><output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<br><br>
<script>
var w;
function startWorker() {
if(typeof(Worker) !== "undefined") {
if(typeof(w) == "undefined") {
w = new Worker("TTMP3.worker.js");
w.postMessage(['This is some text to speak.']);
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
TTMP3.worker.js ...
importScripts('node_modules/browserify-fs/fsbundle.js','node_modules/ivona-node/src/ivonabundle.js');
onmessage = function T2MP3(Text2Speak)
{
postMessage(Text2Speak.data[0]);
//var fs = require('fs'),
// Ivona = require('ivona-node');
var ivona = new Ivona({
accessKey: 'xxxxxxxxxxx',
secretKey: 'xxxxxxxxxxx'
});
//ivona.listVoices()
//.on('end', function(voices) {
//console.log(voices);
//});
// ivona.createVoice(text, config)
// [string] text - the text to be spoken
// [object] config (optional) - override Ivona request via 'body' value
ivona.createVoice(Text2Speak.data[0], {
body: {
voice: {
name: 'Salli',
language: 'en-US',
gender: 'Female'
}
}
}).pipe(fs.createWriteStream('text.mp3'));
postMessage("Done");
}
zrobić trzeba zapisać go na dysku? możesz przesłać dane bin od pracownika na górę, aby zapisać, jeśli naprawdę potrzebujesz, ale nie rozumiem, dlaczego w ogóle trzeba go zapisać. – dandavis
Może, ale co z błędami, które dostaję z węzła ivona? Nie dostałem ich w dom, tylko w webworker. – xendi
Uncaught SyntaxError: nieoczekiwany token var VM39 ivonabundle.js: 23132 – xendi