そもそも、最近IT全般、特にRubyに没頭し始めたばかりで、インターンシップの場を確保するためのテストとしてこの課題を与えられました。スムーズにして改善することがまだあると前もって言いますが、一般的にコードは機能します。
ただし、私の経験は誰かに役立つ可能性があるため、このスクリプトの作成について詳細に説明します。重要:私のオペレーティングシステムはFedora 32です。また、システムにプリインストールされているバンドラーも使用しています。したがって、Linuxのようなシステムも使用している場合は、読み進めてください。
タスクの本質:mp4形式のビデオファイルがあります。このファイルをオーディオに変換し、Yandex SpeechKit Yandexサービスに送信し、回答を受け取ったらテキストファイルを作成する、純粋なルビーでスクリプトを作成する必要があります。
作業を開始する前に、Yandexのドキュメントで、落とし穴や、Yandexが読み取るオーディオ形式などのニュアンスを注意深く調べる必要があります(ちなみに、OggOpusとLPCMの2つしかありません)。
準備段階:
これで、作業計画の作成に進むことができます。
ffmpegユーティリティを使用してファイルをmp4形式からオーディオに変換する
結果のファイルをYandexサービスオブジェクトバケットに送信します
受信した応答をバケット内のファイルのアドレスとともにSpeechKitに送信します
答えを得て、それをテキストファイルに変換します
次に、興味深い(そして必ずしも明白な場所ではない)の説明とともにポイントに沿って移動します
1.ffmpegユーティリティを使用してファイルをmp4形式からオーディオに変換する
ビデオファイルをフォーマットするには、ffmpegをシステムにインストールします
sudo dnf install ffmpeg
そして、まだこれを行っていない場合は、フォーマットが必要なビデオファイルを小さなプロジェクトのフォルダーに入れます(私の場合はtest_taskになります)
同じフォルダーに、スクリプトを作成するrubishファイル(run.rbなど)を作成します。
touch run.rb
ruby (bash-, : system, exec, popen, ` `) (https://www.rubyguides.com/2018/12/ruby-system/)
` `:
`ffmpeg -i test.mp4 -vn -acodec libopus audio.ogg`
:
test.mp4 – .
‘-vn’ , , ( ).
libopus , SpeechKit OggOpus .
audio.ogg – , ( ogg)
, , .
2. Yandex Service Object
.
, , Yandex Object Storage ( ) .
Yandex Object Storage HTTP API, Amazon S3, , Amazon S3.
Amazon S3 aws-sdk-s3, Yandex Object Storage.
aws-sdk-s3. Gemfile :
source 'https://rubygems.org'
gem 'aws-sdk-s3'
gem 'aws-sdk-s3' :
bundle install
run.rb, :
require 'aws-sdk-s3'
API- .
: Object Storage Message Queue.
, - , dotenv. , .env , .
, Gemfile:
gem 'dotenv'
:
bundle install
:
require 'dotenv/load'
.env , :
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXX
. C aws, :
Aws.config.update(
region: 'ru-central1',
credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
)
:
region: 'ru-central1',
credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'],
ENV['AWS_SECRET_ACCESS_KEY'])
s3 = Aws::S3::Client.new(endpoint: "https://storage.yandexcloud.net")
, , . (, (puts pp), )
File.open('audio.ogg', 'r') do |file|
pp = s3.put_object({
bucket: 'teststask',
key: 'audio.ogg',
body: file
})
puts pp
end
run.rb ( ).
3. SpeechKit
http httparty (https://github.com/jnunemaker/httparty/blob/master/examples/basic.rb)
, Gemfile:
gem 'httparty'
:
bundle install
:
require 'httparty'
.
, , . , , : https://storage.yandexcloud.net/<->/<-->
, :
https://storage.yandexcloud.net/teststask/audio.ogg
, , )) !
post SpeechKit.
: API- (API- IAM-)
options.
options = {
headers: {"Authorization" => "Api-Key #{ENV['API_KEY']}"},
body: {
"config" => {
"specification" => {
"languageCode" => "ru-RU"
}
},
"audio" => {
"uri" => "https://storage.yandexcloud.net/teststask/audio.ogg"
}
}.to_json
}
response = HTTParty.post('https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize', options).to_h
, .
.
:
option = {
headers: {"Authorization" => "Api-Key #{ENV['API_KEY']}"}
}
, , , . ( #{response['id']} "https://operation.api.cloud.yandex.net/operations/#{response['id']}").
2 , , )
done = false
until done
yandex_answer = HTTParty.get("https://operation.api.cloud.yandex.net/operations/#{response['id']}", option).to_h
puts yandex_answer
done = yandex_answer['done']
sleep 2
end
4.
ruby, . :
yandex_array = yandex_answer["response"]["chunks"]
yandex_text = []
yandex_array.each do |elem|
yandex_text << elem["alternatives"].first["text"]
end
pp yandex_text.uniq!
bash- :
`touch test.txt`
:
File.open("test.txt", 'w') { |file| file.write(":#{yandex_text.join(' ')}") }
合計で、.env(環境変数を含む)、Gemfile(3つのgemを含む:httparty、aws-sdk-s3、dotenv)、run.rb(コードを含む)の3つのファイルがあります。
出来上がり、ビデオをテキストにフォーマットするための小さなスクリプトがあります。