Google Speech API - 有没有办法确定音频是不是有人声?

Posted

技术标签:

【中文标题】Google Speech API - 有没有办法确定音频是不是有人声?【英文标题】:Google Speech API - Is there a way to determine if the audio has human voice or not?Google Speech API - 有没有办法确定音频是否有人声? 【发布时间】:2019-11-16 05:18:53 【问题描述】:

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

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

   

   ?> ```

【问题讨论】:

云语音 API 无法做到这一点。 我明白了。但是有什么方法可以区分接收成绩单的音频或返回空结果的音频?或者,对于我必须制作的程序,您还有其他建议吗? 【参考方案1】:

所以,我能够自己解决问题。我所要做的就是将成绩单声明为 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();
        

【讨论】:

以上是关于Google Speech API - 有没有办法确定音频是不是有人声?的主要内容,如果未能解决你的问题,请参考以下文章

如何在代理设置后面使用 Google Speech to Text API?

来自浏览器的Google Speech API

Google-speech-api 错误地转录口语数字

403(禁止),Google Speech API 上的无效键错误

是否有适用于 Google 语音识别技术的 API? [关闭]

将 FLAC 或 AMR_WB 中的音频流式传输到 Google Speech API