web-dev-qa-db-ja.com

Google Cloud Speechを使用してSRTファイル(または類似のもの)を生成する方法はありますか?

私のビデオの字幕を生成するために、それらをオーディオファイルに変換し、 Cloud Speech-to-Text を使用しました。動作しますが、書き起こしのみを生成しますが、必要なのは*.srt/*.vtt /類似ファイル。

私が必要としているのは、YouTubeの機能です。文字起こしを生成し、字幕形式などのビデオと同期するには、つまり、文字起こしとキャプションが表示される時間を指定します。

YouTubeにアップロードしてから、自動生成されたキャプションをダウンロードすることもできましたが、あまり正確ではないようです。

Google Cloud Speechを使用してSRTファイル(または類似のもの)を生成する方法はありますか?

9
Lucas Caton

Speech-to-Text APIから直接これを行う方法はありません。できることは、音声認識結果の後処理です。

たとえば、以下はREST APIへのリクエストで、Googleが提供する公開サンプルファイルを使用して、 transcribe video を意図したモデルを使用しています)です。

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'
  }
}"

上記は非同期認識(speech:longrunningrecognize)、より大きなファイルに適しています。 句読点を有効にする'enableAutomaticPunctuation': true開始時間と終了時間 と組み合わせて単語('enableWordTimeOffsets': true)各文の開始と終了の近く(nanoからタイムスタンプに変換する必要もあります)では、テキストファイルを srt形式 で提供できます。また、画面に表示される文の最大長に関する規則も常に含める必要があります。

上記を実装するのはそれほど難しくないはずですが、依然としてタイミング/同期の問題が発生する可能性が高いです。

9
Lefteris S

結果を後処理することをお勧めしますが、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
    }
}
2
Luigi003