Ein Ruby-Skript, das Text in einer Videodatei mithilfe des Yandex SpeechKit Yandex-Dienstes erkennt (langes Audio)

Zunächst habe ich erst kürzlich angefangen, mich mit IT im Allgemeinen und Ruby im Besonderen zu beschäftigen, und diese Aufgabe wurde mir als Test vergeben, um einen Platz für ein Praktikum zu bekommen. Ich werde im Voraus sagen, dass es noch viel zu glätten und zu verbessern gibt, aber im Allgemeinen funktioniert der Code.





Vielleicht kann meine Erfahrung jedoch für jemanden nützlich sein, daher präsentiere ich Ihnen eine detaillierte Beschreibung der Erstellung dieses Skripts. WICHTIG: Mein Betriebssystem ist Fedora 32, ich verwende auch den im System vorinstallierten Bundler. Wenn Sie also auch Linux-ähnliche Systeme verwenden, lesen Sie weiter.





Das Wesentliche der Aufgabe: Es gibt eine Videodatei im MP4-Format. Sie müssen ein Skript in reinem Ruby schreiben, das diese Datei in Audio konvertiert, an den Yandex SpeechKit Yandex-Dienst sendet und nach Erhalt der Antwort eine Textdatei erstellt.





Bevor Sie mit der Arbeit beginnen, sollten Sie die Yandex-Dokumentation sorgfältig auf Fallstricke und Nuancen wie das von Yandex gelesene Audioformat untersuchen (und es gibt übrigens nur zwei davon: OggOpus und LPCM).





Vorbereitungsphase:





Jetzt können Sie mit der Erstellung eines Arbeitsplans fortfahren:





  1. Konvertieren einer Datei vom MP4-Format in Audio mit dem Dienstprogramm ffmpeg





  2. Senden Sie die resultierende Datei an den Yandex Service Object-Bucket





  3. Senden Sie die empfangene Antwort mit der Adresse der Datei im Bucket an SpeechKit





  4. Holen Sie sich die Antwort und konvertieren Sie sie in eine Textdatei





Als nächstes werden wir auf Punkte mit Erklärungen interessanter (und nicht immer offensichtlicher Orte) eingehen.





1. Konvertieren einer Datei vom MP4-Format in Audio mit dem Dienstprogramm ffmpeg





Um die Videodatei zu formatieren, installieren Sie ffmpeg in unserem System





sudo dnf install ffmpeg







Und wenn Sie dies noch nicht getan haben, legen Sie die zu formatierende Videodatei in den Ordner unseres kleinen Projekts (in meinem Fall ist es test_task).





Erstellen Sie im selben Ordner eine Rubish-Datei (z. B. run.rb), in die wir ein Skript schreiben:





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(' ')}") }







Insgesamt haben wir drei Dateien: .env (mit Umgebungsvariablen), Gemfile (mit drei Gems: httparty, aws-sdk-s3, dotenv), run.rb (mit Code).





Voila, du hast ein kleines Skript, um dein Video in Text zu formatieren.








All Articles