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:
Erstellen Sie in Yandex ein Dienstkonto mit der Editor-Rolle
Erstellen Sie einen Bucket im Yandex-Objektspeicher
Jetzt können Sie mit der Erstellung eines Arbeitsplans fortfahren:
Konvertieren einer Datei vom MP4-Format in Audio mit dem Dienstprogramm ffmpeg
Senden Sie die resultierende Datei an den Yandex Service Object-Bucket
Senden Sie die empfangene Antwort mit der Adresse der Datei im Bucket an SpeechKit
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- 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.