有没有一种方法可以使用Google Cloud Speech生成SRT文件(或类似文件)?

Luc*_*ton 7 google-cloud-speech

为了为视频生成字幕,我将其转换为音频文件,并使用了Cloud Speech-to-Text。它的工作原理,但它只能产生改编,而我需要的是一个*.srt/ *.vtt/类似的文件。

我需要的是YouTube要做的:生成字幕并将其与视频同步,就像字幕格式一样,即:字幕应带有字幕的出现时间。

尽管我可以将它们上传到YouTube,然后下载其自动生成的字幕,但这似乎不太正确。

有没有一种方法可以使用Google Cloud Speech生成SRT文件(或类似文件)?

Lef*_*s S 9

真的无法直接通过语音转文字API来执行此操作。您可以尝试对语音识别结果进行一些后处理。

例如,这是使用旨在转录视频的模型对REST API的请求,该模型带有Google提供的公共示例文件:

curl -s -H "Content-Type: application/json" \
    -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
    https://speech.googleapis.com/v1p1beta1/speech:longrunningrecognize \
    --data "{
  'config': {
    'encoding': 'LINEAR16',
    'sampleRateHertz': 16000,
    'languageCode': 'en-US',
    'enableWordTimeOffsets': true,
    'enableAutomaticPunctuation': true,
    'model': 'video'
  },
  'audio': {
    'uri':'gs://cloud-samples-tests/speech/Google_Gnome.wav'
  }
}"
Run Code Online (Sandbox Code Playgroud)

上面使用了异步识别(speech:longrunningrecognize),它更适合大型文件。将标点符号'enableAutomaticPunctuation': true)与每个句子的开头和结尾附近的单词()的开始和结束时间结合使用'enableWordTimeOffsets': true(您还必须将其从nanos转换为时间戳)可以使您以srt格式提供文本文件。您可能还必须包括一些有关在任何给定时间出现在屏幕上的句子的最大长度的规则。

上面的实现应该不太困难,但是,很可能仍然会遇到定时/同步问题。


小智 6

无法使用 Google Cloud 本身购买来完成此操作,建议您可以对结果进行后处理。

在这个文件中,我编写了一个快速代码来完成这项工作。您可能希望根据您的需求进行调整:

function convertGSTTToSRT(string) {
    var obj = JSON.parse(string);
    var i = 1;
    var result = ''
    for (const line of obj.response.results) {
        result += i++;
        result += '\n'
        var word = line.alternatives[0].words[0]
        var time = convertSecondStringToRealtime(word.startTime);
        result += formatTime(time) + ' --> '

        var word = line.alternatives[0].words[line.alternatives[0].words.length - 1]
        time = convertSecondStringToRealtime(word.endTime);
        result += formatTime(time) + '\n'
        result += line.alternatives[0].transcript + '\n\n'
    }
    return result;
}

function formatTime(time) {
    return String(time.hours).padStart(2, '0')+ ':' + String(time.minutes).padStart(2, '0') + ':' + 
   String(time.seconds).padStart(2, '0') + ',000';
}

function convertSecondStringToRealtime(string) {
    var seconds = string.substring(0, string.length - 1);
    var hours = Math.floor(seconds / 3600);
    var minutes = Math.floor(seconds % 3600 / 60);
    seconds = Math.floor(seconds % 3600 % 60);
    return {
        hours, minutes, seconds
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请在此处发布代码。GIST 可能会变得无效。 (5认同)