Apa yang dibicarakan YouTube

gambar

Pada awal pembelajaran mesin, sebagian besar solusi tampak sangat aneh, terisolasi, dan tidak biasa. Saat ini, banyak algoritme ML sudah mengantri untuk famili bagi serangkaian programer framework dan toolkit yang dapat Anda kerjakan tanpa masuk ke detail implementasi mereka.
Ngomong-ngomong, saya menentang pendekatan yang dangkal seperti itu, tetapi saya ingin menunjukkan kepada kolega saya bahwa industri ini bergerak sangat cepat dan tidak ada yang rumit untuk menerapkan pencapaiannya dalam proyek-proyek produksi.

Sebagai contoh, saya akan menunjukkan bagaimana Anda dapat membantu pengguna menemukan materi video yang tepat di antara ratusan lainnya di layanan alur kerja kami.

Dalam proyek saya, pengguna membuat dan berbagi ratusan bahan berbeda: teks, gambar, video, artikel, dokumen dalam berbagai format.

Mencari dokumen sepertinya cukup sederhana. Tetapi apa yang harus dilakukan dengan pencarian konten multimedia? Untuk layanan pengguna yang lengkap, Anda harus berkewajiban untuk mengisi deskripsi, memberikan nama pada video atau gambar, beberapa tag tidak akan sakit. Sayangnya, tidak semua orang ingin menghabiskan waktu untuk peningkatan konten seperti itu. Biasanya pengguna mengunggah tautan ke youtube, melaporkan bahwa ini adalah video baru dan klik simpan. Apa yang dapat dilakukan layanan dengan konten "abu-abu" tersebut? Gagasan pertama adalah bertanya ke YouTube? Tetapi YouTube juga diisi dengan pengguna (seringkali pengguna yang sama). Seringkali materi video mungkin bukan dari layanan Youtube.
Jadi saya mendapat ide untuk mengajarkan layanan kami untuk "mendengarkan" video dan "memahami" tentang apa itu.

Saya akui, ide ini bukan hal baru, tetapi hari ini untuk implementasinya tidak perlu memiliki staf yang terdiri dari sepuluh Ilmuwan Data, hanya dua hari dan sedikit sumber daya perangkat keras.

Pernyataan masalah


Layanan microser kami, sebut saja Summarizer , harus:

  • Unduh video dari layanan media;
  • Ekstrak trek audio;
  • Dengarkan trek audio, sebenarnya Ucapan ke teks;
  • Temukan 20 kata kunci;
  • Pilih satu kalimat dari teks, yang dapat memaksimalkan esensi video;
  • Kirim semua hasil ke layanan konten;

Kami akan mempercayai implementasi Python , jadi Anda tidak harus berurusan dengan integrasi dengan solusi ML siap pakai.

Langkah satu: audio ke teks.

Pertama, instal semua komponen yang diperlukan.

pip3 install wave numpy tensorflow youtube_dl ffmpeg-python deepspeech nltk networkx brew install ffmpeg wget 

Selanjutnya, unduh dan bongkar model yang terlatih untuk solusi Speech to text dari Mozilla - Deepspeech.

 mkdir /Users/Volodymyr/Projects/deepspeech/ cd /Users/Volodymyr/Projects/deepspeech/ wget https://github.com/mozilla/DeepSpeech/releases/download/v0.3.0/deepspeech-0.3.0-models.tar.gz tar zxvf deepspeech-0.3.0-models.tar.gz 

Tim Mozilla menciptakan dan melatih solusi yang cukup baik, dengan menggunakan TensorFlow, dapat mengubah klip audio panjang menjadi potongan besar teks dengan kualitas tinggi. TensorFlow juga memungkinkan Anda bekerja di luar kotak pada CPU dan GPU.

Kode kami akan mulai dengan mengunduh konten. Pustaka youtube-dl yang luar biasa , yang memiliki post-prosesor terintegrasi yang mampu mengonversi video ke format yang diperlukan, akan membantunya dalam hal ini. Sayangnya, kode post-prosesor agak terbatas, tidak tahu cara melakukan resample, jadi kami akan membantu.
Untuk input Deepspeech, Anda perlu mengirimkan file audio dengan trek mono dan sampel 16K. Untuk melakukan ini, kita perlu memproses ulang file yang diterima.

 _ = ffmpeg.input(youtube_id + '.wav').output(output_file_name, ac=1, t=crop_time, ar='16k').overwrite_output().run(capture_stdout=False) 

Dalam operasi yang sama, kita juga dapat membatasi durasi file kita dengan melewatkan parameter tambahan "t".

Unduh model deepspeech.

 deepspeech = Model(args.model, N_FEATURES, N_CONTEXT, args.alphabet, BEAM_WIDTH) 

Dengan menggunakan pustaka wave, kami mengekstrak frame dalam format np.array dan mentransfernya ke input pustaka deepspeech.

 fin = wave.open(file_name, 'rb') framerate_sample = fin.getframerate() if framerate_sample != 16000: print('Warning: original sample rate ({}) is different than 16kHz. Resampling might produce erratic speech recognition.'.format(framerate_sample), file=sys.stderr) fin.close() return else: audio = np.frombuffer(fin.readframes(fin.getnframes()), np.int16) audio_length = fin.getnframes() * (1/16000) fin.close() print('Running inference.', file=sys.stderr) inference_start = timer() result = deepspeech.stt(audio, framerate_sample) 

Setelah beberapa saat, sebanding dengan sumber daya perangkat keras Anda, Anda akan menerima teks.

Langkah Dua: Menemukan “Makna”


Untuk mencari kata-kata yang menggambarkan teks yang dihasilkan, saya akan menggunakan metode grafik. Metode ini didasarkan pada jarak antar sekuens. Pertama-tama kita menemukan semua kata "unik", bayangkan bahwa ini adalah simpul dari grafik kita. Setelah melalui teks dengan "jendela" dengan panjang tertentu, kami menemukan jarak antara kata-kata, mereka akan menjadi tepi galah kami. Verteks yang ditambahkan ke grafik dapat dibatasi oleh filter sintaksis yang hanya memilih unit leksikal dari bagian tertentu dari ucapan. Misalnya, Anda hanya dapat mempertimbangkan kata benda dan kata kerja yang akan ditambahkan ke grafik. Oleh karena itu, kami akan membangun potensi tepi hanya berdasarkan hubungan yang dapat dibangun antara kata benda dan kata kerja.

Skor yang terkait dengan setiap simpul diatur ke nilai awal 1, dan algoritma peringkat diluncurkan. Algoritma peringkat adalah "suara" atau "rekomendasi". Ketika satu titik terhubung ke titik lain, ia "memilih" untuk titik ini (terhubung). Semakin tinggi jumlah suara yang diberikan untuk suatu puncak, semakin tinggi pula pentingnya puncak itu. Selain itu, pentingnya pemilihan menentukan seberapa penting pemilihan itu sendiri, dan informasi ini juga diperhitungkan oleh model peringkat. Oleh karena itu, skor yang terkait dengan bagian atas ditentukan berdasarkan suara yang diberikan untuk itu, dan peringkat puncak yang memberikan suara ini.

Misalkan kita memiliki grafik G = (V, E) yang dijelaskan oleh simpul V dan tepi E. Untuk simpul V yang diberikan, biarkan ada satu set simpul E yang terhubung dengannya. Untuk setiap vertex Vi, ada simpul In (Vi) yang terkait dengannya, dan Out (Vi) simpul yang terkait dengan vertex Vi. Dengan demikian, bobot vertex Vi dapat diwakili oleh rumus.

S besar(Vi besar)= besar(1d besar)+d sumj inIn(Vi) frac1 midOut(Vj) midS big(Vj big)



Di mana d adalah faktor pelemahan / penindasan, mengambil nilai dari 1 hingga 0.

Algoritme harus mengulang grafik beberapa kali untuk mendapatkan perkiraan kasar.
Setelah mendapatkan perkiraan perkiraan untuk setiap simpul dalam grafik, simpul diurutkan dalam urutan menurun. Verteks yang muncul di bagian atas daftar akan menjadi kata kunci yang kami inginkan.

Kalimat yang paling relevan dalam teks ditemukan dengan menemukan rata-rata penambahan peringkat semua kata dalam kalimat. Artinya, tambahkan semua peringkat dan bagi dengan jumlah kata dalam kalimat.

 iMac:YoutubeSummarizer $ cd /Users/Volodymyr/Projects/YoutubeSummarizer ; env "PYTHONIOENCODING=UTF-8" "PYTHONUNBUFFERED=1" /usr/local/bin/python3 /Users/Volodymyr/.vscode/extensions/ms-python.python-2018.11.0/pythonFiles/experimental/ptvsd_launcher.py --default --client --host localhost --port 53730 /Users/Volodymyr/Projects/YoutubeSummarizer/summarizer.py --youtube-id yA-FCxFQNHg --model /Users/Volodymyr/Projects/deepspeech/models/output_graph.pb --alphabet /Users/Volodymyr/Projects/deepspeech/models/alphabet.txt --lm /Users/Volodymyr/Projects/deepspeech/models/lm.binary --trie /Users/Volodymyr/Projects/deepspeech/models/trie --crop-time 900 Done downloading, now converting ... ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers built with Apple LLVM version 10.0.0 (clang-1000.11.45.5) configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 libpostproc 55. 3.100 / 55. 3.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from 'yA-FCxFQNHg.wav': Metadata: encoder : Lavf58.20.100 Duration: 00:17:27.06, bitrate: 1536 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help Output #0, wav, to 'result-yA-FCxFQNHg.wav': Metadata: ISFT : Lavf58.20.100 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s Metadata: encoder : Lavc58.35.100 pcm_s16le size= 28125kB time=00:15:00.00 bitrate= 256.0kbits/s speed=1.02e+03x video:0kB audio:28125kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000271% Loading model from file /Users/Volodymyr/Projects/deepspeech/models/output_graph.pb TensorFlow: v1.11.0-9-g97d851f04e DeepSpeech: unknown Warning: reading entire model file into memory. Transform model file into an mmapped graph to reduce heap usage. 2018-12-14 17:42:03.121170: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Loaded model in 0.5s. Loading language model from files /Users/Volodymyr/Projects/deepspeech/models/lm.binary /Users/Volodymyr/Projects/deepspeech/models/trie Loaded language model in 3.17s. Running inference. Building top 20 keywords... {'communicate', 'government', 'repetition', 'terrorism', 'technology', 'thinteeneighty', 'incentive', 'ponsibility', 'experience', 'upsetting', 'democracy', 'infection', 'difference', 'evidesrisia', 'legislature', 'metriamatrei', 'believing', 'administration', 'antagethetruth', 'information', 'conspiracy'} Building summary sentence... intellectually antagethetruth administration thinteeneighty understanding metriamatrei shareholders evidesrisia recognizing ponsibility communicate information legislature abaddoryis technology difference conspiracy repetition experience government protecting categories mankyuses democracy campaigns primarily attackers terrorism believing happening infection seriously incentive upsetting testified fortunate questions president companies prominent actually platform massacre powerful building poblanas thinking supposed accounts murdered function unsolved perverse recently fighting opposite motional election children watching traction speaking measured nineteen repeated coverage imagined positive designed together countess greatest fourteen attacks publish brought through explain russian opinion winking somehow welcome trithis problem looking college gaining feoryhe talking ighting believe happens connect further working ational mistake diverse between ferring Inference took 76.729s for 900.000s audio file. 

Ringkasan


Ide-ide yang muncul di benak Anda dapat terwujud jauh lebih cepat hari ini daripada bahkan tiga atau empat tahun yang lalu. Cobalah, coba! Saya pikir kecerdasan buatan terutama kecerdasan para insinyur yang bekerja dengannya.

Kode ini tersedia di repositori Github saya .

Source: https://habr.com/ru/post/id433532/


All Articles