You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript从语音识别API返回的无效JSON串中提取最后一个元素

解决方案

完全可以实现提取需求,不需要更换API,这类返回格式是实时语音识别API的通用设计,会逐段返回中间识别结果,最后一段为完整识别结果,以下是具体实现方案:

实现思路

返回内容是多个独立JSON对象拼接的无效JSON串,我们只需要匹配到最后一个完整的JSON对象,解析后提取text字段即可。

代码实现

高容错性实现(推荐)

从后往前遍历字符匹配完整JSON结构,不受多余空白、嵌套JSON结构影响,兼容所有Node.js版本:

function extractLastFinalText(rawResponse) {
  let bracketCount = 0;
  let lastJsonStr = '';
  let currentStr = '';

  // 倒序遍历匹配最后一个完整JSON对象
  for (let i = rawResponse.length - 1; i >= 0; i--) {
    const char = rawResponse[i];
    currentStr = char + currentStr;

    if (char === '}') bracketCount++;
    else if (char === '{') bracketCount--;

    if (bracketCount === 0) {
      lastJsonStr = currentStr.trim();
      break;
    }
  }

  if (!lastJsonStr) return null;

  try {
    const lastObj = JSON.parse(lastJsonStr);
    return lastObj.text ?? null;
  } catch (parseErr) {
    return null;
  }
}

// 测试示例
const testRawData = `{
  "text": "Play"
}
{
  "text": "Play astronaut"
}
{
  "text": "Play astronaut in the"
}
{
  "text": "Play astronaut in the ocean"
}
{
  "entities": {},
  "intents": [],
  "text": "Play astronaut in the ocean.",
  "traits": {}
} `;

console.log(extractLastFinalText(testRawData)); 
// 输出:Play astronaut in the ocean.

轻量实现

如果确认API返回内容仅包含纯JSON对象拼接、无多余非JSON内容,可以用字符串替换转成合法JSON数组的方式实现,性能更高:

function extractLastFinalTextLite(rawResponse) {
  try {
    // 替换多个JSON间隔为逗号,包裹为合法JSON数组
    const validArrayStr = `[${rawResponse.trim().replace(/}\s*\{/g, '},{')}]`;
    const resultArr = JSON.parse(validArrayStr);
    return resultArr.at(-1)?.text ?? null;
  } catch (err) {
    return null;
  }
}

内容的提问来源于stack exchange,提问作者nasser aldosry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:03