Un script ruby ​​qui reconnaît le texte dans un fichier vidéo à l'aide du service Yandex SpeechKit Yandex (audio long)

Pour commencer, j'ai récemment commencé à me plonger dans l'informatique en général et Ruby en particulier, et j'ai eu cette mission à titre de test pour obtenir une place pour un stage. Je dirai à l'avance qu'il y a encore quelque chose à lisser et à améliorer, mais en général le code fonctionne.





Cependant, mon expérience peut peut-être être utile à quelqu'un, je présente donc à votre attention une description détaillée de la création de ce script. IMPORTANT: Mon système d'exploitation est Fedora 32, j'utilise également le bundler pré-installé dans le système. Donc, si vous utilisez également des systèmes de type Linux, lisez la suite.





L'essence de la tâche: il existe un fichier vidéo au format mp4, vous devez écrire un script en rubis pur, qui convertira ce fichier en audio, l'envoyer au service Yandex SpeechKit Yandex et, après avoir reçu la réponse, créer un fichier texte.





Avant de commencer le travail, vous devez étudier attentivement la documentation Yandex pour les pièges et les nuances telles que le format audio lu par Yandex (et, au fait, il n'y en a que deux: OggOpus et LPCM).





Phase préparatoire:





Vous pouvez maintenant procéder à l'élaboration d'un plan de travail:





  1. Conversion d'un fichier du format mp4 en audio à l'aide de l'utilitaire ffmpeg





  2. Envoyez le fichier résultant vers le compartiment Yandex Service Object





  3. Envoyez la réponse reçue avec l'adresse du fichier dans le bucket à SpeechKit





  4. Obtenez la réponse et convertissez-la en fichier texte





Ensuite, nous avancerons le long des points avec des explications de lieux intéressants (et pas toujours évidents)





1. Conversion d'un fichier du format mp4 en audio à l'aide de l'utilitaire ffmpeg





Pour formater le fichier vidéo, installez ffmpeg dans notre système





sudo dnf install ffmpeg







Et, si vous ne l'avez pas encore fait, mettez le fichier vidéo à mettre en forme dans le dossier de notre petit projet (dans mon cas, ce sera test_task)





Dans le même dossier, créez un fichier rubish (par exemple, run.rb), dans lequel nous écrirons un script:





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







Au total, nous avons trois fichiers: .env (avec des variables d'environnement), Gemfile (avec trois gemmes: httparty, aws-sdk-s3, dotenv), run.rb (avec code).





Voila, vous avez un petit script pour formater votre vidéo en texte.








All Articles