«Неверное распознавание« config »: неверный код языка». когда это не должно быть - PullRequest
0 голосов
/ 08 июня 2019

Попытка запустить распознавание речи в php возвращает ошибку о том, что он не может распознать код языка из внешнего файла .json.С другой стороны, в документации Google по API четко указано, что это необходимо.

Я также использовал файл конфигурации EXACT SAME для запуска вызова из CLI с curl, и он работал отлично.Я понятия не имею, почему это не работает.

Файл .json RecognitionConfig выглядит следующим образом:

"config": {
  //encoding is missing since I have an external process converting
  //the files to .wav format
  "sampleRateHertz":8000,
  "audioChannelCount": 1,
  "enableSeparateRecognitionPerChannel": false,
  "languageCode":"ro-RO",
  "maxAlternatives": 1,
  "profanityFilter": false,
  "speechContexts": [
    {
      "phrases": [
        "lorem",
        "ipsum",
        "dolor",
        "sit amet"
      ]
    }
  ],
  "enableWordTimeOffsets": false,
  "model": "default",
  "useEnhanced": false
  }

Несмотря на то, что "ro-RO" является языковым кодом, который распознается в официальномДокументация, при загрузке страницы возвращается сообщение об ошибке:
«Недопустимое распознавание« config »: неверный код языка.», «code»: 3, «status»: «INVALID_ARGUMENT», «details»: [], Что дает?Где я ошибся и, что более важно, ПОЧЕМУ?

Вызов и создание кода php выглядит следующим образом:

$recogConfig = '/path/to/config/file.json';
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json');
//both use absolute paths

$configString = file_get_contents($recogConfig);
$configObj = json_decode($configString/*, true -this doesn't work either*/);
echo $configString; //works, returns the contents aforementioned json file

После чего любой тип взаимодействия с $ cofigObj выдает «Вызов нанулевая ошибкаЯ понимаю, что наткнулся на передачу файла JSON в php, но каждое руководство, которое я изучал, говорит, что это должно работать, и я не могу понять, какая его часть дает сбой.Помимо простого ответа, я хотел бы знать, как сделать передачу файла json более подробной, чтобы я мог видеть, где происходит сбой процесса и почему.

1 Ответ

0 голосов
/ 10 июня 2019

Когда вы json_decode($configString), вы получаете объект со свойствами, определенными в JSON. Ваш JSON-объект - это не что иное, как держатель переменной, и он не содержит никаких функций. Поэтому, когда вы вызываете ->setLanguageCode() для вашего объекта конфигурации, он явно не работает.

Когда я смотрю на класс RecognitionConfig репозитория Github , я вижу, что класс ожидает получить массив свойств, представляющих различные настройки. Пример конфигурации JSON также показывает, что он соответствует простому объекту JSON с парами ключ-значение:

{
  "encoding": enum(AudioEncoding),
  "sampleRateHertz": number,
  "audioChannelCount": number,
  "enableSeparateRecognitionPerChannel": boolean,
  "languageCode": string,
  ...
}

тогда как в вашем коде вы заключаете массив в объект с помощью ключа "config" и массива настроек:

{ "config": {
    //encoding is missing since I have an external process converting
    //the files to .wav format
    "sampleRateHertz":8000,
  ...
  }
}

Либо удалите элемент "config" (моя рекомендация, поскольку JSON будет соответствовать документам снова), либо измените свой код для доступа к элементу config вместо этого:

$config = (new RecognitionConfig($configObj->config)); 

Дайте мне знать, если это поможет вам.

...