1

我正在制作一个音频过滤应用程序,它可以读取数百个音频文件并对其进行过滤。因此,如果音频中有人声,它将接受它,如果没有,它将删除音频文件。

我正在使用 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();

   }

   ?> ```

4

1 回答 1

0

因此,我能够为自己解决问题。我必须做的就是将成绩单声明为 null 以获得我需要的解决方案。以前,如果音频没有返回任何内容,它不会执行任何操作,因此会跳过删除部分。将 $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();
        }
于 2019-12-20T19:38:39.650 回答