【问题标题】:Problems while parsing a json file coming from google speech server解析来自谷歌语音服务器的 json 文件时出现问题
【发布时间】:2014-01-15 12:36:08
【问题描述】:

我正在尝试在我的程序中实现 google 语音识别 api。为此,我使用下面的函数来解析从谷歌服务器发送的 json 文件。但是程序有时运行良好,有时运行不正常并出现访问冲突错误

代码如下。问题出在哪里?无论如何在解析之前检查json对象是否为真格式?

function TGoogleSpeech.Convert(const stream: TStream): string;
var
  ret: string;
  js: TlkJSONobject;
begin
  try
    ret := FHttp.Post(FURL, stream);
    js := TlkJSON.ParseText(ret) as TlkJSONobject;
    try
      Result := js.Field['hypotheses'].Child[0].Field['utterance'].Value;
    finally
      js.Free;
    end;
  except
    Result := '';
  end;
end;

我正在使用the uLKJSOn library

【问题讨论】:

  • 如果发生了哪一行 AV ?什么是 AV 错误的完整文本?实现日志记录,当 AV 发生时将其与完整的服务器响应一起记录到文件中。您需要有可重现的输入数据。我的盲目猜测是,中间某处的js.Field['hypotheses'].Child[0].Field['utterance'].Value; 返回nil,因为您的数据没有该字段。将字符串拆分为每个语句一个点并检查 nil。然后看哪一行生成AV。喜欢var1 := js.Field['hypotheses']; /next line/ var2 := var1.Child[0]; /next line/ var3 := var2.Field [..]; var4 := ..
  • 您也可以尝试其他 json 库 stackoverflow.com/questions/14864170 但我认为您只有服务器响应而没有您认为必须存在的字段。我认为它们仅在某些时候存在,而在其他时候您尝试从 nil 中提取值。只是猜测
  • 是的,我们知道您会遇到访问冲突。但是该语句至少有五个子表达式。哪一个是问题? Arioch 建议你如何解决这个问题。 Stack Overflow 不是个人调试服务。请改用从 Embarcadero 获得的调试器。查看ret中的值;它总是包含你所期望的吗?
  • 反编译器?反编译器不是调试工具!请阅读我的第一条评论。您应该将您的超大行拆分为 5 条简单的行(“分而治之”),最好检查 varN := Var(N-1).xxxx; if nil = varN then raise Exception.Create('varN is nil!'); 然后如果发生异常 - 记录其文本并将谷歌响应值记录到文本文件中。您必须制作可重现的案例。您必须确定触发 AV 的 retFURL 的某些值
  • 是的。您还没有分享更多问题。 “不起作用”是什么意思?

标签: json delphi speech-recognition access-violation


【解决方案1】:

各位,我找到了答案: 而且真的很有趣 当识别不好时,谷歌服务器将此代码作为 json 发送

{"status":5,"id":"","hypotheses":[]}

它没有话语字段,这会导致问题。

因此我进行了此更新并使用下面的代码清理了不需要的部分

 ret :=ansireplacetext(ret,'{"status":5,"id":"","hypotheses":[]}','');

    if (AnsiContainsText(ret,'utterance') and (length(ret)>1)  then

等等..

【讨论】:

  • 你还是做错了。阅读 cmets 并理解它们,而不是抨击 cmets(并且固执?)。如果“话语”一词在其他任何地方,例如在值中,则此代码将失败。 The'Arioch 为您提供所需的一切。不投票结束这个问题,因为它仍然可以为其他人服务,但不赞成这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多