无法通过child_process在 Google 云函数中使用 Sox 命令



我正忙于编写一个由Google Cloud Storage活动激活的Google云函数。我需要在child_process中使用袜子 - 但没有取得多大成功。

此函数选取音频文件/事件,然后需要计算文件的长度,然后显示该文件。

当我运行以下代码(在我的索引中.js(:

'use strict';
const exec = require('child_process').exec;
const fs = require('fs');
const path = require('path');
const storage = require('@google-cloud/storage')();
const vision = require('@google-cloud/vision').v1p1beta1;
const client = new vision.ImageAnnotatorClient();

exports.processAudiofile = (event) => {
const object = event.data;
if (object.resourceState === 'not_exists') {
console.log('This is a deletion event.');
return;
} else if (!object.name) {
console.log('This is a deploy event.');
return;
}
const file = storage.bucket(object.bucket).file(object.name);
const filePath = `gs://${object.bucket}/${object.name}`;
console.log(`Analyzing ${file.name}.`);
console.log(`Filepath is ${filePath}.`);
return new Promise((resolve, reject) => {
exec(`sox --i -d ${filePath}`, function(err, stdout){
if (err){
throw err;
}
console.log("Duration:" + stdout);//Prints
});
});
};

使用以下包.json:

{
"name": "audiotest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/language": "^1.2.0",
"@google-cloud/speech": "^1.5.0",
"@google-cloud/storage": "^1.6.0",
"@google-cloud/vision": "^0.19.0",
"child_process": "^1.0.2",
"fs": "0.0.1-security",
"got": "^8.3.1",
"path": "^0.12.7",
"sox": "^0.1.0"
}
}

我收到以下错误:

Error: Command failed: sox --i -d gs://rawaudiobucket/shortcall.wav 
/bin/sh: 1: sox: not found at ChildProcess.exithandler 
(child_process.js:199:12) at emitTwo (events.js:106:13) at 
ChildProcess.emit (events.js:191:7) at maybeClose 
(internal/child_process.js:920:16) at Socket.<anonymous> 
(internal/child_process.js:351:11) at emitOne (events.js:96:13) at 
Socket.emit (events.js:188:7) at Pipe._handle.close [as _onclose] 
(net.js:509:12)

任何这方面的帮助将不胜感激!

看起来您假设sox在运行云函数的实例中可用作命令行程序。 除非该特定程序已被记录在案(如ImageMagicconvert(,否则您不应该依赖它。

请注意,袜子模块的 npm 页面说:

需要安装 sox CLI。这可以通过大多数 linux 发行版的包管理器安装。

如果您提供自己的 Linux 编译二进制文件,则可以直接执行它。 通过节点模块构建和运行它将是它自己的问题。

最新更新