2014-01-15 2 views
0

Я пытаюсь реализовать api для распознавания речи goi в своей программе. Для этого я использую функцию ниже для анализа файла json, отложенного с сервера google. Однако программа иногда работает хорошо, а иногда и не получает ошибку нарушения доступаПроблемы при анализе json-файла, поступающего с речевого сервера google

Код приведен ниже. Где проблема? все равно, чтобы проверить, является ли объект 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.

+2

, если какие именно линии АВ происходит? Каков полный точный текст ошибки AV? Внедряйте ведение журнала, когда AV-сервер регистрирует его в файл вместе с полным ответом сервера. Вам нужно будет иметь воспроизводимые входные данные. Мое слепое предположение заключается в том, что 'js.Field ['гипотезы']. Child [0] .Field ['utterance']. Значение;' где-то посередине возвращает 'nil', потому что ваши данные не имеют этого поля. Разделите строку на одну точку на инструкцию и проверьте наличие нил. Затем посмотрите, какая строка генерирует AV. как 'var1: = js.Field ['гипотезы'];/next line/var2: = var1.Child [0];/next line/var3: = var2.Field [..]; var4: = ..' –

+0

вы также можете попробовать другие json libs http://stackoverflow.com/questions/14864170, но я думаю, что у вас есть ответ сервера без полей, которые вы предполагаете, должны существовать. Они, я думаю, существуют только иногда, а иногда вы пытаетесь извлечь значения из nil. Просто догадаться –

+0

@ user3057015 Я отредактировал ваш вопрос, добавив ссылку на используемую вами библиотеку JSON. В следующий раз, когда вы разместите вопрос, убедитесь, что вы описали все типы, которые вы используете в своем коде. –

ответ

0

ребят я нашел ответ: И это действительно интересно, , когда признание не является хорошим Googleserver отправляет этот код как JSON

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

он не имеет произнесение поля и эту проблема вызывает.

Поэтому я сделал это обновление и очистить ненужную часть, используя этот код

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

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

и так далее ..

+0

Вы по-прежнему делаете это неправильно. Прочитайте комментарии ** и поймите их ** вместо того, чтобы отстреливать комментарии (и быть упрямыми?). Этот код терпит неудачу, если слово «высказывание» находится где угодно, например, в значении. «Ариох» дал вам все, что вам нужно. Не голосуйте, чтобы закрыть вопрос, потому что он все равно может служить другим, но отрицать этот ответ. –

+0

iyi halt yedin! – user3057015

Смежные вопросы