Librerie e framework importanti: Express (4.6.1), Bootstrap (4.0), jQuery (3.3.1), Handlebars (4.0.1).
Tutte le dipendenze segnate su package.json
nella cartella webserver.
Cosa vogliamo ottenere
L'upload di un file da locale al webserver in express.
I file saranno in particolare le registrazioni, quindi se salvate con un formato lossless raggiungeranno dai 20-100 MB (10 min di .wav registrato quanto pesa?).
Soluzioni considerate
Ogni richiesta per express passa per un middleware, di default abbiamo body-parser
, che transforma automaticamente JSON e si occupa degli url codificati.
Per i file tuttavia è necessario un altro middleware, e dopo varie ricerche: express 4+ ha tolto il supporto a req.files
, il miglior middleware è busboy
.
Soluzione scelta
busboy
è stato portato su express sotto il nome di multer
. Può essere usato come middleware per-route e permette la gestione dei file comodamente.
Implementazione
- Aggiungere ad una route (Come?)
- Il file è disponibile nella request, su
req.file
Riferimenti: "File uploading in express 4"; "Express 4 simple file uploads (multer)".
Cosa vogliamo ottenere
Creare un file audio comprensibile da Google Cloud Speech. Specifiche:
- Encoding: Per i risultati migliori usare FLAC o LINEAR16 (pesanti), altrimenti OGG_OPUS (leggero ma qualità inferiore);
- SampleRateHertz: minima/default 16000 Hz, di solito si aggira sui 44100hz;
- Canali: deve essere mono-canale.
Soluzioni da considerare
- MediaStream API: tutti i browser moderni (No IE, ma Edge si):
- microphone-stream: wav, API semplice, stream audio (?), config completa;
- Web Audio API: (tutti i browser moderni) comandi comodi, abbastanza complesso ma completo. Librerie:
- opus-recorder: ogg o wav, API semplice, tutti i browser, config completa; encoder + decoder + lib = ~60 KB (da testare!);
- msr (Media Stream Recorder): ogg o wav, API semplice, tutti i browser, config completa, demo non funzionante (a me); minified_lib = 40 KB (da testare!);
- WebAudioRecorder.js [demo]: supporta .wav, .mp3, .ogg; configurazioni comode e semplici; vecchia, aggiornata 3 anni fa; migliore candidata per ora, se riuscissimo a testarla;
- JSSoundRecorder [demo]
- recorderjs [demo, code]: wav;
- Speech.streamingRecognize: (è fattibile via browser? Richiede gli
stream
).
Soluzione scelta
opus-recorder
. Supportato da tutti i browser moderni e rientra esattamente nelle specifiche di codifica richieste da Google Cloud Speech.
Implementazione
- Richiede i permessi del microfono e assicura il funzionamento;
- Se non sento niente o livello molto basso segnalo con un feedback visivo;
- Registra localmente tramite JS un audio tramite una delle soluzioni sopra elencate;
- Stoppata la registrazione uploada automaticamente il file su Storage:
- identificato dal nome-progetto e data-registrazione (YYYY-MM-DD HH:mm:ss)
- vanno salvate altre informazioni nei metadata, come encoding, sampleRate, ecc?
- Finito l'upload chiede se si vuole scaricare (per backup?).