Search code examples
node.jsffmpeggoogle-speech-api

Can not find file with ffmpeg


I am programming a server in node.js to process a audio file. I save the file with this code:

app.use(upload());
app.get("/", function (req, res) {
res.sendFile("index.html")
});
//Uploaded files will be saved
app.post("/", function (req, res) {
if (req.files) {
    var file = req.files.filename,
        filename = file.name;
    file.mv("./upload/" + filename, function (err) {
        if (err) {
            console.log("err");
        }
        else {
            res.send("Done");
            console.log(filename);
            convert(filename);

        }
    })
}
})

I save the file in my upload directory. There everthing works great but now comes the problem. I convert the file with ffmpeg

function convert(filename) {    
var realName = "./upload/" + filename;
var newName = "./output/" + filename.substr(0, filename.length - 4) + ".flac";
ffmpegN = ffmpeg(realName);
ffmpegN.audioBitrate(16).audioFrequency(16000).withAudioCodec('flac').format("flac").save(outputFile);

ffmpeg(realName)
    .toFormat('flac')
    .on('error', (err) => {
        console.log('An error occurred: ' + err.message);
    })
    .on('progress', (progress) => {
        // console.log(JSON.stringify(progress));
        console.log('Processing: ' + progress.targetSize + ' KB converted');
    })
    .on('end', () => {
        console.log('Processing finished !');
    })
    .save(newName);//path where you want to save your file    
SpeechToText(newName);
}

Then I want to pass this file to the google speech api. But then I get the error that the file is not found Here is the code for the Speech Api:

function SpeechToText(path) {
// The name of the audio file to transcribe
const fileName = path;

// Reads a local audio file and converts it to base64
const file = fs.readFileSync(fileName);
const audioBytes = file.toString('base64');

// The audio file's encoding, sample rate in hertz, and BCP-47 language code
const audio = {
    content: audioBytes,
};
const config = {
    encoding: 'FLAC',        
    languageCode: 'de-DE',
};
const request = {
    audio: audio,
    config: config,
};

// Detects speech in the audio file
client
    .recognize(request)
    .then(data => {
        const response = data[0];
        const transcription = response.results
            .map(result => result.alternatives[0].transcript)
            .join('\n');
        console.log(`Transcription: ${transcription}`);
    })
    .catch(err => {
        console.error('ERROR:', err);
    });
}

The thing is that if I upload a file everything works. But if I try it for a second time the error occurs:

fs.js:646
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
             ^

Error: ENOENT: no such file or directory, open                 
'C:\Users\paulu\desktop\API\output\sample.flac'
at Object.fs.openSync (fs.js:646:18)
at Object.fs.readFileSync (fs.js:551:33)
at SpeechToText (C:\Users\paulu\desktop\API\server.js:68:21)
at convert (C:\Users\paulu\desktop\API\server.js:121:5)
at C:\Users\paulu\desktop\API\server.js:50:17
at doMove (C:\Users\paulu\desktop\API\node_modules\express- 
fileupload\lib\index.js:152:17)
at WriteStream.<anonymous> (C:\Users\paulu\desktop\API\node_modules\express- 
fileupload\lib\in                             dex.js:182:15)
at emitNone (events.js:106:13)
at WriteStream.emit (events.js:208:7)
at fs.close (fs.js:2094:12)

Thank you for all answers !


Solution

  • I fixed it.

    The problem was that the ffmpeg process was not finished. Here the solution:

    function convert(filename) {    
    var realName = "./upload/" + filename;
    var newName = "./output/" + filename.substr(0, filename.length - 4) + ".flac";    
    
    
    ffmpeg(realName)
    .toFormat('flac')
    .on('error', (err) => {
        console.log('An error occurred: ' + err.message);
    })
    .on('progress', (progress) => {
        // console.log(JSON.stringify(progress));
        console.log('Processing: ' + progress.targetSize + ' KB converted');
    })
    .on('end', () => {
        console.log('Processing finished !');
        SpeechToText(newName); //Just move this statement to here !
    })
    .save(newName);//path where you want to save your file    
    
    }