Skrip ruby ​​yang mengenali teks dalam file video menggunakan layanan Yandex SpeechKit Yandex (audio panjang)

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:





  1. Mengonversi file dari format mp4 ke audio menggunakan utilitas ffmpeg





  2. Kirim file yang dihasilkan ke keranjang Objek Layanan Yandex





  3. Kirim tanggapan yang diterima dengan alamat file di keranjang ke SpeechKit





  4. 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- (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.








All Articles