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

RSSからYoutube/Podcast配信

PodCastでの音声配信

PodCastでの音声配信

Fire Base Hostingを使用してのPodCast配信
静的コンテンツ配信にFire Base Hostingが使えそうなので、ここからRSSフィードとmp3音声ファイルを配信します。
以前のBlogger連携と同様にFirebaseのAPIも管理できるように変更してください。

Fire Base Hostingの設定

Fire Baseコンソールにアクセスしてプロジェクトを作成します。

またプロジェクト内に入り「+アプリを追加」をクリックして、次に(</>)をクリックしてWebアプリケーションの設定ワークフローを起動します。

FireBaseHostingを有効にして、指示された通りにnpmを実行していくと、プロジェクトとアプリが作成されます。
作成が終わると表示されるプロジェクトの設定画面にあるプロジェクト-IDをプログラムの中で使うので覚えていてください。

また[プロジェクトの設定] > [サービス アカウント] を開きます。


[新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。
キーを含む JSON ファイルを「firebase.json」ファイルとして保管します。

ライブラリの追加

$ pip install firebase_admin

Pythonプログラム
test.pyに以下のコードを記述します。
公式のサンプルを一部変更して持ってきています。
test.py
FIREBASE_SECRETS_FILE = "./firebase.json"

FIREBASE_HOSTING_URL = "https://firebasehosting.googleapis.com/v1beta1"
FIREBASE_HOSTING_SITE = FIREBASE_HOSTING_URL + "/sites/project-id"

def fb_getToken():
    cred = credentials.Certificate(FIREBASE_SECRETS_FILE)
    token = cred.get_access_token()
    return token.access_token

def fb_getVersion(token):

    url = FIREBASE_HOSTING_SITE + "/versions"

    headers = {
            'Content-Type': "application/json",
            'Authorization': "Bearer " + token
          }

    response = requests.request("GET", url, headers=headers,timeout=REQUEST_TIMEOUT)
    json_str = json.loads(response.text)
    writeable_version = None
    for version in json_str['versions']:

        if 'CREATED' in version['status']:
            writeable_version = version['name']

    if writeable_version == None:
        url = FIREBASE_HOSTING_SITE + "/versions"

        response = requests.request("POST", url, headers=headers,timeout=REQUEST_TIMEOUT)
        json_str = json.loads(response.text)
        writeable_version = json_str['name']

    return writeable_version

def fb_upload(token,version,path):
    fb_files = []
    params = {
          'files' : {
            }
          }
    headers = {
            'Content-Type': "application/json",
            'Authorization': "Bearer " + token
          }

    fnames = listup_files(path)

    for fname in fnames:
        gzname = fname + '.gz'
        with open(path + fname,mode='rb') as f:
            data = f.read()

        with gzip.open('/tmp/'+gzname, mode='wb') as fp:
            fp.seek(0)
            fp.write(data)

        with open('/tmp/'+gzname, mode='rb') as f:
            gz_data = f.read()

        hash = hashlib.sha256()
        hash.update(gz_data)
        hex = hash.hexdigest()
        params['files']['/'+fname] = hex 
        fb_files.append({"hash":hex,"name":fname,"context":gz_data})

    url = FIREBASE_HOSTING_URL + "/" + version + ':populateFiles'

    response = requests.request("POST", url, headers=headers,data=json.dumps(params),timeout=REQUEST_TIMEOUT)
    json_str = json.loads(response.text)
    req_list = json_str['uploadRequiredHashes']
    url = json_str['uploadUrl']

    headers = {
            'Content-Type': "application/octet-stream",
            'Authorization': "Bearer " + token
          }

    for req in req_list:
        for fb_file in fb_files:
           if fb_file['hash'] == req:
               context = fb_file["context"]
               response = requests.request("POST", url + '/' + str(req), headers=headers,data=context,timeout=REQUEST_TIMEOUT)


def fb_finalyze(token,version):
    url = FIREBASE_HOSTING_URL + "/" + version + '?update_mask=status'
    params = {
          'status' : 'FINALIZED'
          }
    headers = {
            'Content-Type': "application/json",
            'Authorization': "Bearer " + token
          }

    response = requests.request("PATCH", url, headers=headers,data=json.dumps(params),timeout=REQUEST_TIMEOUT)


def fb_deploy(token,version):
    url = FIREBASE_HOSTING_SITE + "/releases?versionName=" + version
    headers = {
            'Content-Type': "application/json",
            'Authorization': "Bearer " + token
          }

    response = requests.request("POST", url, headers=headers,timeout=REQUEST_TIMEOUT)

def postPodcast_fb(podcast_dir):
    try :
        makeFeedXml(podcast_dir)
        token = fb_getToken()
        version = fb_getVersion(token)
        fb_upload(token,version,podcast_dir)
        fb_finalyze(token,version)
        fb_deploy(token,version)
    except Exception as e:
        print (e)

"project-id"は作成した自分のfirebaseのプロジェクトIDを指定してください。
このpostPodcast_fb()をgetRss()から呼び出します。
test.py
def getRss():
    with open('/tmp/temp.mp3' ,mode='wb+') as f:
        f.truncate(0) 
    rssUrl = 'https://news.google.com/news/rss/headlines/section/topic/TECHNOLOGY'
    rssLang = '?hl=en-US&gl=US&ceid=US:en'
    feed = feedparser.parse(rssUrl + rssLang)
    for entry in feed.entries:
            link = entry.get('link')
            getBody(link)
    postPodcast_fb('/tmp/')

上記だと毎回実行の際にファイルがtruncateされるので、代わりに日時からファイル名を付けるなどして別名で保存する様にしてください。
ともかくこれでポッドキャストの自動アップロードがGoogleサービスだけでできました!
私のポッドキャストを公開しているのでよかったら聴いてください。

Apple Podcast
Google Podcast
Amazon Podcast

参考URL:

https://firebase.google.com/docs/web/setup

https://firebase.google.com/docs/hosting/quickstart

https://firebase.google.com/docs/hosting/api-deploy


このブログの人気の投稿

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