Pertama-tama, saya baru saja mulai membenamkan diri di bidang IT secara umum dan Ruby pada khususnya, dan tugas ini diberikan kepada saya sebagai ujian untuk mendapatkan tempat magang. Saya akan mengatakan sebelumnya bahwa masih ada sesuatu untuk diperhalus dan ditingkatkan, tetapi secara umum kodenya berfungsi.
Namun, mungkin pengalaman saya dapat bermanfaat bagi seseorang, jadi saya sajikan untuk perhatian Anda penjelasan rinci tentang pembuatan skrip ini. PENTING: Sistem operasi saya adalah Fedora 32, saya juga menggunakan bundler yang sudah diinstal sebelumnya di sistem. Jadi jika Anda juga menggunakan sistem mirip linux, baca terus.
Inti dari tugas: ada file video dalam format mp4, Anda perlu menulis skrip dalam ruby ββmurni yang akan mengubah file ini menjadi audio, mengirimkannya ke layanan Yandex SpeechKit Yandex dan, setelah menerima jawaban, buat file teks.
Sebelum mulai bekerja, Anda harus mempelajari dokumentasi Yandex dengan cermat untuk menemukan kesalahan dan nuansa seperti format audio yang dibaca oleh Yandex (dan hanya ada dua di antaranya, omong-omong: OggOpus dan LPCM).
Tahap persiapan:
Sekarang Anda dapat melanjutkan untuk menyusun rencana kerja:
Mengonversi file dari format mp4 ke audio menggunakan utilitas ffmpeg
Kirim file yang dihasilkan ke keranjang Objek Layanan Yandex
Kirim tanggapan yang diterima dengan alamat file di keranjang ke SpeechKit
Dapatkan jawabannya dan ubah menjadi file teks
Selanjutnya, kita akan membahas poin-poin dengan penjelasan tentang tempat-tempat yang menarik (dan tidak selalu jelas)
1. Mengonversi file dari format mp4 ke audio menggunakan utilitas ffmpeg
Untuk memformat file video, instal ffmpeg ke dalam sistem kami
sudo dnf install ffmpeg
Dan, jika Anda belum melakukan ini, letakkan file video yang perlu diformat di folder proyek kecil kami (dalam kasus saya itu akan menjadi test_task)
Di folder yang sama, buat file rubish (misalnya, run.rb), di mana kami akan menulis skrip:
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(' ')}") }
Secara total, kami memiliki tiga file: .env (dengan variabel lingkungan), Gemfile (dengan tiga permata: httparty, aws-sdk-s3, dotenv), run.rb (dengan kode).
Voila, Anda memiliki sedikit skrip untuk memformat video Anda ke teks.