Yandex SpeechKit Yandexサービス(長いオーディオ)を使用してビデオファイル内のテキストを認識するルビースクリプト

そもそも、最近IT全般、特にRubyに没頭し始めたばかりで、インターンシップの場を確保するためのテストとしてこの課題を与えられました。スムーズにして改善することがまだあると前もって言いますが、一般的にコードは機能します。





ただし、私の経験は誰かに役立つ可能性があるため、このスクリプトの作成について詳細に説明します。重要:私のオペレーティングシステムはFedora 32です。また、システムにプリインストールされているバンドラーも使用しています。したがって、Linuxのようなシステムも使用している場合は、読み進めてください。





タスクの本質:mp4形式のビデオファイルがあります。このファイルをオーディオに変換し、Yandex SpeechKit Yandexサービスに送信し、回答を受け取ったらテキストファイルを作成する、純粋なルビーでスクリプトを作成する必要があります。





作業を開始する前に、Yandexのドキュメントで、落とし穴やYandexが読み取るオーディオ形式などのニュアンスを注意深く調べる必要があります(ちなみに、OggOpusとLPCMの2つしかありません)。





準備段階:





これで、作業計画の作成に進むことができます。





  1. ffmpegユーティリティを使用してファイルをmp4形式からオーディオに変換する





  2. 結果のファイルをYandexサービスオブジェクトバケットに送信します





  3. 受信した応答をバケット内のファイルのアドレスとともにSpeechKitに送信します





  4. 答えを得て、それをテキストファイルに変換します





次に、興味深い(そして必ずしも明白な場所ではない)の説明とともにポイントに沿って移動します





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- (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つのファイルがあります。





出来上がり、ビデオをテキストにフォーマットするための小さなスクリプトがあります。








All Articles