Google Speech API - есть ли способ определить, имеет ли звук человеческий голос или нет?

Я делаю приложение для фильтрации звука на работе, которое читает более сотни аудиофайлов и фильтрует их. Итак, если в звуке есть человеческий голос, он его примет, а если нет - удалит аудиофайл.

Я использую ffmpeg, чтобы получить подробную информацию об аудио и добавить другие фильтры, такие как размер, продолжительность и тишина (хотя это не очень точно при обнаружении тишины для всех аудиофайлов).

Моя компания попросила меня попробовать Google Cloud Speech API, чтобы определить, есть ли в звуке человеческий голос.

Таким образом, с помощью этого кода некоторые аудиофайлы возвращают расшифровку произнесенных слов в аудиофайле, но мне нужно определить, говорит человек или нет.

Я подумал об использовании для этого hark.js, но, похоже, документации недостаточно, и у меня мало времени!

Пс. Я стажер и только начинаю заниматься программированием. Прошу прощения, если мой вопрос не имеет смысла или звучит глупо.



   # Includes the autoloader for libraries installed with composer
   require __DIR__ . '/vendor/autoload.php';

   # Imports the Google Cloud client library
   use Google\Cloud\Speech\V1\SpeechClient;
   use Google\Cloud\Speech\V1\RecognitionAudio;
   use Google\Cloud\Speech\V1\RecognitionConfig;
   use Google\Cloud\Speech\V1\RecognitionConfig\AudioEncoding;

   putenv('GOOGLE_APPLICATION_CREDENTIALS=../../credentials.json');



   echo getcwd() . "<br>";
   chdir('test-sounds');
   echo getcwd() . "<br>";
   echo shell_exec('ls -lr');

   $fileList = glob('*');
   foreach($fileList as $filename){
   //echo $filename, '<br>';

   # The name of the audio file to transcribe
   $audioFile = __DIR__ . '/' . $filename;

   # get contents of a file into a string
   $content = file_get_contents($audioFile);

   # set string as audio content
   $audio = (new RecognitionAudio())
       ->setContent($content);

   # The audio file's encoding, sample rate and language
   $config = new RecognitionConfig([
       'encoding' => AudioEncoding::LINEAR16,
       'language_code' => 'ja-JP'
   ]);

   # Instantiates a client
   $client = new SpeechClient();

   # Detects speech in the audio file
   $response = $client->recognize($config, $audio);

   # Print most likely transcription
   foreach ($response->getResults() as $result) {
       $alternatives = $result->getAlternatives();
       $mostLikely = $alternatives[0];
       $transcript = $mostLikely->getTranscript();
       printf('<br>Transcript: %s' . PHP_EOL, $transcript . '<br>');

   }

   $client->close();

   }

   ?> ```

1 ответ

Итак, я смог решить проблему для себя. Что мне нужно было сделать, так это объявить стенограмму нулевой, чтобы получить нужное мне решение. Раньше он ничего не делал, если звук ничего не возвращал, поэтому часть удаления пропускалась. После инициализации переменной $ transcript как null условие для удаления было выполнено.

Сама система не идеальна. Идея состоит в том, что если Google Speech API возвращает какую-либо расшифровку, система решает, что она принимает аудиофайл. В противном случае звук удаляется из моей системы. Есть несколько типов аудио, которые не принимаются. Как бы то ни было, он отвечал требованиям, которые были установлены для меня, так что я полагаю, что меня это устраивает. Не знаю, пригодится ли это кому-нибудь еще.

Пс. Приведенный ниже код немного отличается от кода в моем вопросе, потому что он из моей программы

try {
            # Detects speech in the audio file
            $response = $client->recognize($config, $audio);

            # Print most likely transcription

            //The below line is what did the trick
            $transcript = null;

            foreach ($response->getResults() as $result) {
                $alternatives = $result->getAlternatives();
                $mostLikely = $alternatives[0];
                $transcript = $mostLikely->getTranscript();
                //printf('<br>Transcript: %s' . PHP_EOL, $transcript . '<br>');

                echo "<td>" . $rowcount . "</td>";
                echo "<td>" . $filename3 . "</td>";
                echo "<td>" . $transcript ."</td>";
                echo "<td>" . "<audio controls> <source src='" .$filename3. "' type='audio/wav'> </audio>" . "</td>";


            }
            if ($transcript == null) {
                // echo '<br>'.$filename3.' blah <br>';
                rename($filename3, '../Trash/delete/'.$filename3);
            }

        } catch (Exception $e) {
            // Do something
        } finally {
            $client->close();
        }
Другие вопросы по тегам