Google 使用 base64 的语音 bash 脚本: 意外的标记。\n

Google Speech bash script with base64 : Unexpected token.\n

我使用以下代码:https://github.com/sararob/ml-talk-demos/blob/master/speech/request.sh 适合我自己的 bash 脚本。

cat <<EOF > $JSONFILENAME
{
  "config": {
    "encoding":"LINEAR16",
    "sampleRateHertz":8000,
    "languageCode": "nl-NL",
    "speechContexts": {
      "phrases": ['']
    },
    "maxAlternatives": 1
  },
  "audio": {
    "content":
    }
}
EOF
base64  -w 0 > $SOUNDFILE.base64
#MYBASE64=$(base64  -w 0)
sed -i $JSONFILENAME -e "/\"content\":/r $SOUNDFILE.base64"
#sed -i $JSONFILENAME -e "/\"content\":/r $MYBASE64"
curl -s -X POST -H "Content-Type: application/json" --data-binary @${JSONFILENAME} https://speech.googleapis.com/v1/speech:recognize?key=$API_KEY

base64 输出由 sed 命令正确填写,但也添加了换行符。

这是 Google API 响应:

{
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unexpected token.\n\": {\n    \"content\":\nUklGRqTIAgBXQVZFZm10\n                    ^",
    "status": "INVALID_ARGUMENT"
  }
}

如何确保我的 JSON-object 中的 "content" 是连续的 base64 字符串?

您应该避免使用 sed 更新 JSON 数据。

如果您有有效的 JSON 数据(即您必须修复行 "phrases": []"content": "",您可以使用 jq 代替:

jq ".audio.content = \"$(base64 -w 0 "")\"" "$JSONFILENAME"

我不推荐sed,但在这种情况下必须附加一个大的条目,你可以试试这个:

echo \"$(base64 -w 0 "")\" > "$SOUNDFILE.base64"
sed -i "$JSONFILENAME" -e "/\"content\":/r $SOUNDFILE.base64"

您收到的 google 错误可能是由于该字符串未被双引号引起的。