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?
403(禁止),Google Speech API 上的无效键错误