youtube_whisper_(sample).ipynb

# -*- coding: utf-8 -*-

音声認識する youtube 動画の URL をペーストしてください。

#@title  { form-width: "50%" }
urltext = ""#@param {type:"string"}

print(urltext)

youtube 動画のなかで使用している言語を選択してください。

ja : Japanese

en : English

#@title  { form-width: "60%" }
dropdown = "en" #@param ["ja", "en"] {allow-input: true}

from urllib.parse import urlparse, parse_qs

args = [urltext]
video_id = ''

def extract_video_id(url):
    query = urlparse(url)
    if query.hostname == 'youtu.be': return query.path[1:]
    if query.hostname in {'www.youtube.com', 'youtube.com'}:
        if query.path == '/watch': return parse_qs(query.query)['v'][0]
        if query.path[:7] == '/embed/': return query.path.split('/')[2]
        if query.path[:3] == '/v/': return query.path.split('/')[2]
    # fail?
    return None

for url in args:
    video_id = (extract_video_id(url))
    print('youtube video_id:',video_id)

from IPython.display import YouTubeVideo

YouTubeVideo(video_id)

youtube 動画から音声認識する音声を抽出

1
2
3
!rm -rf e*.wav
!python3 -m pip install -U yt-dlp
!yt-dlp -x --audio-format wav --output "extract.%(ext)s" {urltext}


OpenAI whisper

音声認識のプログラムをセットアップ
description
https://openai.com/blog/whisper/

!pip install git+https://github.com/openai/whisper.git

音声認識プログラムの言語モデルを準備

1
2
3
4
import whisper

# model = whisper.load_model("large")
model = whisper.load_model("medium")

抽出した音声ファイルの確認

!echo | ls *wav

soundfile = "extract.wav"

whisper で音声認識 → テキスト化

画面左のフォルダに out.txt ファイルができます。

import sys

temp = sys.stdout
sys.stdout = open('out.txt', 'w+')
result = model.transcribe(soundfile, verbose=True, language=dropdown)
sys.stdout.close()  
sys.stdout = temp

text = result['text']
print()

print(text)

subtitle.srt という字幕ファイルが作られます。

画面左のフォルダにファイルができます。

import sys
import re
from google.colab import files

temp = sys.stdout
with open("out.txt", mode='r',encoding='utf-8') as f:
    lines = f.readlines()

    sys.stdout = open('subtitles.srt', 'w+')
    counter = 0
    for ind,line in enumerate(lines):

        #[00:00.000 --> 00:04.320]  
        if (timecode := re.findall(r'\[(.+?)\]\s', line)):
            counter += 1
            print(counter)
            if (ch1 := re.findall(r'\d+\:\d+\:\d+\.\d+',timecode[0])):  
                print(timecode[0].replace('.', ','))
            else:
                if (ch2 := re.findall(r'\d+\:\d+\.\d+',timecode[0])):  
                    print("00:" + ch2[0].replace('.', ','),end="")
                    print(" --> 00:" + ch2[1].replace('.', ','))
                    #    print(timecode[0].replace('.', ','))

        if (dropdown == "ja"):
            if (strings := re.findall(r'.+?\]\s(\S*?)$', line)):
                print(strings[0])
                print()
        else:
            if (strings := re.findall(r'.+?\]\s\s(.*?)$', line)):
                print(strings[0])
                print()

    sys.stdout.close()

sys.stdout = sys.__stdout__
files.download('subtitles.srt')

文章要約の工程

言語指定

1
2
3
#@title  { form-width: "100%" }
#言語指定
LANGUAGE = "english"#@param ["english","japanese"] {allow-input: true}

1
2
3
4
5
6
7
with open("subtitles.srt",'r') as f:
    lines = f.readlines()
    for line in lines:
        if (timecode := re.match(r'\d+:\d+\:\d+\,\d+', line)):
            print(timecode)
        else:
            print(line)

要約文数

1
2
3
#@title  { form-width: "100%" }
#要約文数
SENTENCES_COUNT = 32#@param {type:"integer"}

!pip install sumy tinysegmenter

文章要約に必要なモジュールをインポート

from __future__ import absolute_import
from __future__ import division, print_function, unicode_literals
import nltk
nltk.download('punkt')

from sumy.parsers.html import HtmlParser
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
##    from sumy.summarizers.lsa import LsaSummarizer as Summarizer
from sumy.summarizers.lex_rank import LexRankSummarizer
from sumy.nlp.stemmers import Stemmer
from sumy.utils import get_stop_words

文章圧縮 LexRANK アルゴリズムを使用

#インプットとしては、WEBページのURLを指定 または、テキストファイル入力

#url = ""
#parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE))

# plain text files
#parser = PlaintextParser.from_file("document.txt", Tokenizer(LANGUAGE))

# text strings
parser = PlaintextParser.from_string(text, Tokenizer(LANGUAGE))
stemmer = Stemmer(LANGUAGE)

##    summarizer = Summarizer(stemmer)
summarizer = LexRankSummarizer(stemmer)
summarizer.stop_words = get_stop_words(LANGUAGE)

for sentence in summarizer(parser.document, SENTENCES_COUNT):
    print(sentence)
Edit
Pub: 06 Mar 2023 07:43 UTC
Edit: 06 Mar 2023 07:55 UTC
Views: 53