用ffmpeg找不到文件

时间:2018-08-02 15:43:06

标签: node.js ffmpeg google-speech-api

我正在node.js中对服务器进行编程以处理音频文件。 我用以下代码保存文件:

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);

        }
    })
}
})

我将文件保存在上传目录中。一切都很好,但现在出现了问题。 我用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);
}

然后,我想将此文件传递给Google Speech API。但是然后我得到一个错误,即找不到文件 这是语音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);
    });
}

问题是,如果我上传文件,一切正常。但是,如果我第二次尝试,则会发生错误:

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)

谢谢所有答案!

1 个答案:

答案 0 :(得分:0)

我修复了。

问题是ffmpeg进程尚未完成。解决方法如下:

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    

}