スキップしてメイン コンテンツに移動

RSSからYoutube/Podcast配信

StableDiffusionを使った画像生成&動画生成

 

StableDiffusionが世を賑わかせているので、便乗してニュースのテキストから画像を生成し、TTSの音声と併せて動画にしてみた。

まずは画像生成用のモジュールから。

!pip install accelerate diffusers transformers scipy ftfy
# make sure you're logged in with `huggingface-cli login`
from torch import autocast
from diffusers import StableDiffusionPipeline
import gc
SDpipe = StableDiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2",
    use_auth_token="enter your token"
).to("cuda")


def getImgFromPrompt(prompt,imgName):
    gc.collect(generation=0)
    gc.collect(generation=1)
    gc.collect(generation=2)
    image = SDpipe(prompt,height=512, width=512).images[0]
    display(image)
    image.save(imgName)

上記で以下のpromptを入れてみた。

Exclusive: JPMorgan looking to finance Italy's Serie A for up to 1 billion euros | Reuters

 Sassuolo v AC Milan - Mapei Stadium - Citta del Tricolore, Reggio Emilia, Italy - May 22, 2022 AC Milan's Alessio Romagnoli lifts the trophy with teammates after winning the Serie A REUTERS/Alberto Lingria

N) has written to Italy's top soccer league to express a preliminary interest in supporting the development of Serie A's media business, three people close to the matter said.

 bank rivals that of several investment funds which have approached Serie A as the league prepares to hold a tender to sell its domestic and international broadcasting licences for the seasons after 2024.

※参考日本語訳

独占。JPモルガン、イタリア・セリエAに最大10億ユーロの融資を検討|ロイター

 サッスオーロ対ACミラン - マペイ・スタジアム - イタリア、レッジョ・エミリア、チッタ・デル・トリコローレ - 2022年5月22日 セリエAを制し、チームメートとトロフィーを掲げるACミランのアレッシオ・ロマニョーリ REUTERS/Alberto Lingria

イタリアサッカー界のトップリーグであるセリエAのメディア事業の発展を支援するため、ACミラン [本社:イタリア・ミュンヘン、代表取締役会長兼社長:ヴォルフガング・ニェール] が同リーグに文書を送付したと、関係者3人が明らかにした。

 セリエAが2024年以降の国内・国際放送免許の売却入札を控えている中、複数の投資ファンドがセリエAに接触しているが、そのうちの1社に匹敵するものである。

これで以下の画像が出力されてきます。


これをGoogle TTSで取得した音声と静止画を合わせます。

ついでにTTSのデフォルトの音声がゆっくり過ぎるので1.5倍速に変更しています。

def makeVideo(org_txt,trans_text,fname):
    png_name = '/tmp/' + fname + '.png'
    mp3_name = '/tmp/' + fname + '.mp3'
    mp4_name = '/tmp/' + fname + '.mp4' 
    try:

        getGtts(mp3_name,trans_text,True)
        getImgFromPrompt(org_txt,png_name)

        rtn = subprocess.run('ffmpeg -encoders', shell=True, stdout=PIPE, stderr=PIPE, text=True)
        if ('h264_nvenc' in rtn.stdout):
            enc = 'h264_nvenc'
        else :
            enc = 'libx264'

        cmd = 'ffmpeg -y '
        cmd += ' -loop 1 -i ' + png_name
        cmd += ' -i ' + mp3_name + ' -filter:a "atempo=1.5" '
        cmd += ' -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v ' + enc 
        cmd += ' -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1M -b:a 384k -pix_fmt yuv420p -map 0:v:0 -map 1:a:0 -shortest '
        cmd += mp4_name
        rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
        return True
    except Exception as ee:
        print(str(ee) + "\n")
        return False


上記で作成された短い動画を一つの動画にまとめて、YouTubeへ送信。


def streamVideo(title,fname,desc):
    try:
        list_name = '/tmp/{}.list'.format(fname)
        cmd = 'rm -f {};for f in `ls -dtr /tmp/{}*.mp4`; do echo "file \'$f\'" >> {}; done && '.format(list_name,fname,list_name)
        cmd += 'ffmpeg -f concat -safe 0 -i {} -c copy /tmp/{}total.mp4 '.format(list_name,fname)
        rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)

        rtn = subprocess.run('ffmpeg -encoders', shell=True, stdout=PIPE, stderr=PIPE, text=True)
        if ('h264_nvenc' in rtn.stdout):
            enc = 'h264_nvenc'
        else :
            enc = 'libx264'

        key = getStreamKey(title,desc)
        if key == None:
            print( "Non Key Error!")
            shutil.copyfile('/tmp/{}total.mp4'.format(fname) ,WORK_DIR + '{}total.mp4'.format(fname))
            return

        cmd = 'sleep 5 && ffmpeg -y -re '
        cmd += ' -i /tmp/{}total.mp4 '.format(fname)
        cmd += ' -codec copy '
        cmd += ' -f flv rtmp://a.rtmp.youtube.com/live2/' + key 
        cmd += ' && sleep 10 '
        rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
        return True

    except Exception as ee:
        print( "Exception is occurred in streaming!")
        print(str(ee) + "\n")
        return False


これで同じ動画を配信し続けるライブストリーミングから脱却できました!

その時の動画になりますが以下をご覧ください。

https://www.youtube.com/watch?v=v-Ff-cUuets

このブログの人気の投稿

RSSからYoutube/Podcast配信

皆さん、情報収集はどの様にされていますでしょうか? 私は最先端に情報に触れる為、海外ニュースをRSSで購読しているのですが、私の英語力/語彙力では時間が掛かかってしょうがない。 また、できれば目で読むのではなく、音声で聞き流しながら通勤や他の作業中に行いたい。 という事で自動でニュースを収集・要約・翻訳し、それをブログ・ポッドキャスト・Youtubeに自動投稿するPythonプログラムを作成して時短化しました。 その手法を公開してますので参考にしてください。 Bloggerの立ち上げ方 GCPとBloggerの連携 情報収集自動化 Blogger自動投稿 本文要約 翻訳 音声作成 動画作成 Youtubeにアップロード Youtubeの投稿制限の回避方法 Podcast配信 翻訳・要約の改善(GPT-3) 以下のURLで上記から作成したブログやYoutubeを公開しています。参考までに見てください。 ブログ:海外ニュースを仕入れてお届け YouTube:海外Newsを仕入れてお届け Amazon Music:海外ニュースを仕入れてお届け。 Google Podcasts:海外ニュースを仕入れてお届け。 Apple Podcasts:海外ニュースを仕入れてお届け。

本文要約

要約 今回は現在使用している方法とは異なり、実装が簡単な要約方法になります。 参考元にはニューラルネットワーク(accel-brain-base)を使用した例などもありますので、そちらを参考にしてください。 Pythonライブラリの追加 以下のライブラリをインストールしてください。 $ pip install pysummarization Pythonプログラム test.pyに以下のコードを記述します。 ここでソース記事の各行を重みづけしてから、重要度の高い5つの行だけを選択します。 test.py from pysummarization.nlpbase.auto_abstractor import AutoAbstractor from pysummarization.tokenizabledoc.simple_tokenizer import SimpleTokenizer from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor def getSummary ( text ): # Object of automatic summarization. auto_abstractor = AutoAbstractor () # Set tokenizer. auto_abstractor . tokenizable_doc = SimpleTokenizer () # Set delimiter for making a list of sentence. auto_abstractor . delimiter_list = [ ". " , ". \n " , " \n " ] # Object of abstracting and filtering document. abstractable_doc = TopNRankAbstractor () # Summarize document. result_dict = auto_abstrac

Bloggerの立ち上げ

Bloggerとは BloggerはGoogleのサービスの一つで、無料でブログを始めることができます。 Googleアカウントが必要となりますので、ない方はアカウントの作成をお願いします。 Bloggerサイトへのログイン https://www.blogger.com/から「ブログの作成」を選択してください。 Googleアカウントを聞かれるので、Googleアカウントとパスワードを入力してください。 ブログの名前を入力 作成するブログの名前を決めます。これは後から変えられるのでとりあえずは書こうとしてる内容に沿ったものを記入してください。 ブログのURL(インターネット上の所在地)を作成します。 こちらも変更できる(※)のですがので、頻繁に変更すると読者や検索などから外されてしますので、個人名や法人名など変更しないことを前提に名付けた方が良いと思います。 (※「.blogspot.com」以外のカスタムドメインを自分でとって、それを設定することもできます) プロファイルの作成 ブログが作成されるとプロファイルの作成画面が出てきます。ブログ読者に見られることを意識して、ユーザー名やわかりやすい説明を記入しましょう。 以上でブログが作成できました。作成したURLをブラウザに打ち込んでみましょう! 貴方だけのブログサイトが立ち上がりました。 次は GCP(Google Cloud Platform)とBloggerを連携 させてみましょう。 参考: Blogger Help