ffmpeg - 如何使用 Google 的 Cloud Speech-to-Text REST API 转录视频

标签 ffmpeg speech-recognition video-processing speech-to-text google-speech-api

我想要 2 个人在视频中讲话的文字记录,但我从 Cloud Speech-to-Text API 得到一个空的响应

方法:

我有一个 56 分钟的视频文件,其中包含两个人之间的对话。我想要那次谈话的文字记录,我想使用 Google 的 Cloud Speech-to-Text API 来获得它。

为了在我的谷歌云存储上节省一点,我首先使用 mmpeg 将视频转换为音频。

首先,我尝试使用下面的命令找出音频编解码器,它看起来像 AAC。ffmpeg -i video.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'videoplayback.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2015-12-30T08:17:14.000000Z
  Duration: 00:56:03.99, start: 0.000000, bitrate: 362 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 490x360 [SAR 1:1 DAR 49:36], 264 kb/s,     29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
    Metadata:
      creation_time   : 2015-12-30T08:17:31.000000Z
      handler_name    : IsoMedia File Produced by Google, 5-11-2011    

所以我从视频中使用:ffmpeg -i video.mp4 -vn -acodec copy myaudio.aac
到目前为止的详细信息:ffmpeg -i myaudio.aac输出:
Input #0, aac, from 'myaudio.aac':
  Duration: 00:56:47.49, bitrate: 97 kb/s
    Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 97 kb/s

之后我将其转换为 opus,因为有人告诉我 opus 更好ffmpeg -i myaudio.aac -acodec libopus -b:a 97k -vbr on -compression_level 10 myaudio.opus
到目前为止的信息:opusinfo myaudio.opus
User comments section follows...
    encoder=Lavc58.18.100 libopus
Opus stream 1:
    Pre-skip: 312
    Playback gain: 0 dB
    Channels: 2
    Original sample rate: 48000Hz
    Packet duration:   20.0ms (max),   20.0ms (avg),   20.0ms (min)
    Page duration:   1000.0ms (max), 1000.0ms (avg), 1000.0ms (min)
    Total data length: 29956714 bytes (overhead: 0.872%)
    Playback length: 56m:03.990s
    Average bitrate: 71.24 kb/s, w/o overhead: 70.62 kb/s

我此时将 myaudio.opus 上传到了 Google Cloud Storage。

curl POST 1
我通过使用 curl 进行 POST 来开始语音识别:
curl --request POST  --header "Content-Type: application/json" --url 'https://speech.googleapis.com/v1/speech:longrunningrecognize?fields=done%2Cerror%2Cmetadata%2Cname%2Cresponse&key={MY_API_KEY}' --data '{"audio": {"uri": "gs://{MY_BUCKET}/myaudio.opus"},"config": {"encoding": "OGG_OPUS", "sampleRateHertz": 48000, "languageCode": "en-US"}}'

响应:{"name": "123456789"}123456789 不是实际值。

curl GET 1
现在我想得到结果:
curl --request GET --url 'https://speech.googleapis.com/v1/operations/123456789?fields=done%2Cerror%2Cmetadata%2Cname%2Cresponse&key={MY_API_KEY}'

这给了我错误:Error : Unable to recognize speech, possible error in encoding or channel config. Please correct the config and retry the request.
所以我将编码配置从 OGG_OPUS 更新为 LINEAR16

curl POST 2
又发了个帖子:
curl --request POST  --header "Content-Type: application/json" --url 'https://speech.googleapis.com/v1/speech:longrunningrecognize?fields=done%2Cerror%2Cmetadata%2Cname%2Cresponse&key={MY_API_KEY}' --data '{"audio": {"uri": "gs://{MY_BUCKET}/myaudio.opus"},"config": {"encoding": "LINEAR16", "sampleRateHertz": 48000, "languageCode": "en-US"}}'

响应:{"name": "987654321"}
curl GET 2
curl --request GET --url 'https://speech.googleapis.com/v1/operations/987654321?fields=done%2Cerror%2Cmetadata%2Cname%2Cresponse&key={MY_API_KEY}'

回复:
{
  "name": "987654321",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "progressPercent": 100,
    "startTime": "2018-06-08T11:01:24.596504Z",
    "lastUpdateTime": "2018-06-08T11:01:51.825882Z"
  },
  "done": true
}

问题是我没有得到实际的转录。根据文档,在包含数据的响应中应该有一个 response 键。

由于我有点卡在这里,我想知道我是否做错了什么。我没有任何技术或资源限制,因此非常欢迎所有建议!也很高兴改变我的方法。

提前致谢!干杯

最佳答案

Looks like目前仅支持 WAV 和 FLAC。
使用 gcloud在本地命令,我成功了:

gcloud ml speech recognize-long-running gs://bucket-name/file.flac  --language-code en-US --include-word-time-offsets > my_transcription.json

使用本地文件时出现字节限制错误。 Says you can

关于ffmpeg - 如何使用 Google 的 Cloud Speech-to-Text REST API 转录视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760057/

相关文章:

ffmpeg时间单位解释及av_seek_frame方法

android - 如何让 SOX 的 rec 脚本在 Android 上工作?

php - 我可以从 PHP 调用多核 LAMP 机器上的多个 FFMPEG 进程吗?

java - CMUSphinx 真人语音识别太慢?

Android startActivityForResult 请求代码与启动谷歌语音到文本时给出的不同

c - 如何识别 mpegts 文件?

http - 我需要多少种视频格式? - 网络

python - 无法在 python 中读取 .wav 文件

c# - 必应语音识别服务 - SpeechClient 问题 "Audio format could not be parsed."

python - 如何使用 Python 提取视频文件的比特率和其他统计信息