ما يوتيوب يتحدث عنه

الصورة

في فجر التعلم الآلي ، بدت معظم الحلول غريبة للغاية ومعزولة وغير عادية. اليوم ، تصطف العديد من خوارزميات ML بالفعل في مجموعة مألوفة لمجموعة من الأطر ومجموعات الأدوات التي يمكنك التعامل معها دون الخوض في تفاصيل تنفيذها.
بالمناسبة ، أنا أعارض هذا النهج السطحي ، لكنني أود أن أوضح لزملائي أن هذه الصناعة تسير على قدم وساق وليس هناك شيء معقد لتطبيق إنجازاتها في مشاريع الإنتاج.

كمثال ، سأوضح كيف يمكنك مساعدة المستخدم في العثور على مادة الفيديو المناسبة بين مئات آخرين في خدمة سير العمل لدينا.

في مشروعي ، يقوم المستخدمون بإنشاء ومشاركة مئات المواد المختلفة: النص والصور ومقاطع الفيديو والمقالات والمستندات بتنسيقات مختلفة.

البحث عن المستندات يبدو بسيطًا بدرجة كافية. ولكن ماذا تفعل مع البحث عن محتوى الوسائط المتعددة؟ للحصول على خدمة مستخدم كاملة ، يجب عليك ملء وصف أو إعطاء اسم للفيديو أو الصورة ، فلن تؤذي عدة علامات. لسوء الحظ ، لا يريد الجميع قضاء بعض الوقت في تحسينات المحتوى هذه. عادةً ما يقوم المستخدم بتحميل رابط إلى youtube ، ويفيد بأنه مقطع فيديو جديد وينقذ حفظ. ماذا يمكن أن تفعل الخدمة مع هذا المحتوى "الرمادي"؟ الفكرة الأولى هي أن تسأل يوتيوب؟ لكن يوتيوب مليء أيضا بالمستخدمين (في كثير من الأحيان نفس المستخدم). غالبًا ما لا تكون مواد الفيديو من خدمة Youtube.
لذلك حصلت على فكرة لتدريس خدمتنا على "الاستماع" إلى الفيديو و "فهم" ما هو عليه.

أعترف ، أن هذه الفكرة ليست جديدة ، لكن اليوم لتنفيذها ، ليس من الضروري أن يكون لديك فريق من عشرة علماء بيانات ، يومين فقط وموارد الأجهزة قليلاً.

بيان المشكلة


خدماتنا المصغرة ، دعنا نسميها Summarizer ، ينبغي:

  • تحميل الفيديو من خدمة وسائل الإعلام ؛
  • استخراج المسار الصوتي.
  • الاستماع إلى المسار الصوتي ، في الواقع الكلام إلى النص ؛
  • العثور على 20 كلمة رئيسية ؛
  • حدد جملة واحدة من النص ، والتي يمكن أن تزيد من جوهر الفيديو ؛
  • إرسال جميع النتائج إلى خدمة المحتوى ؛

سنثق في تطبيق Python ، لذلك لن تضطر إلى التعامل مع التكامل مع حلول ML الجاهزة.

الخطوة الأولى: الصوت إلى النص.

أولاً ، قم بتثبيت جميع المكونات الضرورية.

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

بعد ذلك ، قم بتنزيل وإلغاء فك النموذج المدربين لحل Speech to text من 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 

قام فريق Mozilla بإنشاء وتدريب حل جيد إلى حد ما ، باستخدام TensorFlow ، يمكنه تحويل مقاطع الصوت الطويلة إلى أجزاء كبيرة من النص بجودة عالية. يسمح لك TensorFlow أيضًا بالعمل خارج الصندوق على كل من وحدة المعالجة المركزية ووحدة معالجة الرسومات.

سيبدأ الكود الخاص بنا بتنزيل المحتوى. وستساعده مكتبة youtube-dl الرائعة ، التي تحتوي على معالج ما بعد مدمج قادر على تحويل الفيديو إلى التنسيق المطلوب ، في هذا الأمر. لسوء الحظ ، فإن شفرة ما بعد المعالج محدودة بعض الشيء ، ولا تعرف كيفية إعادة التشكيل ، لذلك سنساعدها.
إلى إدخال Deepspeech ، تحتاج إلى إرسال ملف صوتي بمسار أحادي وعينة 16 كيلو. للقيام بذلك ، نحتاج إلى إعادة معالجة ملفنا المستلم.

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

في نفس العملية ، يمكننا أيضًا تحديد مدة ملفنا عن طريق تمرير معلمة إضافية "t".

قم بتنزيل نموذج deeppeech.

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

باستخدام مكتبة الموجة ، نقوم باستخراج الإطارات بتنسيق np.array ونقلها إلى إدخال مكتبة deeppeech.

 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) 

بعد فترة ، بما يتناسب مع موارد الأجهزة الخاصة بك ، سوف تتلقى النص.

الخطوة الثانية: البحث عن "معنى"


للبحث عن الكلمات التي تصف النص الناتج ، سأستخدم طريقة الرسم البياني. تعتمد هذه الطريقة على المسافة بين التسلسلات. أولاً نجد كل الكلمات "الفريدة" ، تخيل أن هذه هي رؤوس الرسم البياني لدينا. بعد المرور عبر النص مع "نافذة" بطول معين ، نجد المسافة بين الكلمات ، وستكون حواف الغرفة. يمكن تحديد القمم المضافة إلى الرسم البياني بواسطة مرشحات بناء الجملة التي تحدد فقط وحدات معجمية لجزء معين من الكلام. على سبيل المثال ، يمكنك فقط مراعاة الأسماء والأفعال المراد إضافتها إلى الرسم البياني. لذلك ، سنقوم ببناء حواف محتملة تستند فقط على العلاقات التي يمكن تأسيسها بين الأسماء والأفعال.

يتم تعيين النتيجة المرتبطة بكل قمة على قيمة أولية قدرها 1 ، ويتم إطلاق خوارزمية الترتيب. خوارزمية الترتيب هي "تصويت" أو "توصية". عندما يكون رأسًا واحدًا متصلاً بآخر ، فإنه "يصوت" لهذا الرأس (المتصل). كلما زاد عدد الأصوات المدلى بها لذروة ، ارتفعت أهمية تلك الذروة. علاوة على ذلك ، تحدد أهمية أعلى الاقتراع مدى أهمية التصويت نفسه ، ويتم أخذ هذه المعلومات في الاعتبار أيضًا من خلال نموذج التصنيف. لذلك ، يتم تحديد النتيجة المرتبطة بالأعلى بناءً على الأصوات المدلى بها ، وتصنيف القمم التي تدلي بهذه الأصوات.

افترض أن لدينا رسمًا بيانيًا G = (V، E) موصوفًا بالقمم V والحواف E. بالنسبة لقمة معينة V ، فليكن هناك مجموعة من الرؤوس E المرتبطة بها. لكل قمة رأس سادسة ، توجد رؤوس (سادسة) مرتبطة بها ، ورؤوس خارج (سادسة) ترتبط بها قمة سادسة. وبالتالي ، يمكن تمثيل وزن قمة الرأس السادس بالصيغة.

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



حيث d هو عامل التوهين / الكبت ، مع أخذ قيمة من 1 إلى 0.

يجب أن تقوم الخوارزمية بتكرار الرسم البياني عدة مرات للحصول على تقديرات تقريبية.
بعد الحصول على تقدير تقريبي لكل قمة في الرسم البياني ، يتم فرز الرؤوس بترتيب تنازلي. ستكون القمم التي تظهر في أعلى القائمة هي كلماتنا الرئيسية المطلوبة.

تم العثور على الجملة الأكثر صلة في النص من خلال إيجاد متوسط ​​إضافة تصنيفات جميع الكلمات في الجملة. بمعنى ، نضيف كل التقديرات ونقسم عدد الكلمات في الجملة.

 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. 

ملخص


يمكن أن تتحقق الأفكار التي تتبادر إلى ذهنك بشكل أسرع اليوم حتى من ثلاث أو أربع سنوات مضت. جربه ، اختبر! أعتقد أن الذكاء الاصطناعي هو في المقام الأول ذكاء المهندسين الذين يعملون معها.

الرمز متاح في مستودع جيثب الخاص بي .

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


All Articles