Amazon Polly で商品テキストを音声化 → 紹介動画をつくる

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、ここのところ出遅れてしまった感があるAWSを体験するためにいくつか記事を公開してきましたが、それらは全てLaravelでの開発でした。

ただ、たまにはPythonも使っておかないとすぐ忘れちゃうな、ということでいろいろ考えてたところ、1つやってみたいことを思い出しました。

それは・・・・・・

商品紹介ページの動画化

です。

例えば、あるスイーツ店がインターネットで「特製ワッフル」を紹介していて、それを動画化するというものです。

動画編集といえば、「作業がたいへん…😫」と言われていますが、「そこまで凝ったものじゃなくても動画を作りたい」という要望はきっとあるんじゃないかなと思い、今回はこのテーマで記事お届けすることにしました。

ぜひ何かの参考になりましたら嬉しいです😊✨

「Python は完全に
VS Codeに移行しました。
ゴメンね Atom…」

開発環境: Python 3.8.5, Shell Script

前提として

動画の作成はffmpegを使って行います。
そのため、先にffmpegをインストールしておいてください。

📝 ダウンロードページ: Download FFmpeg

動画化する手順

ウェブサイトの個別ページから動画をつくる手順は次のとおりです。

  1. 商品ページのデータを取得 ※
  2. Amazon Polly を使って紹介テキストを音声化(mp3)
  3. 音声だけだと寂しいので別で用意しておいたBGMを合成
  4. 商品の写真と音声を使って動画をつくる(画像はズームする)

※ 今回、データはDBから取ってくることを想定しているので、スクレイピングなどは行いません。

記事内のデータについて(協力してくれたお店)

せっかくやるからには、実際のお店が公開しているページを動画化したいと思ったので、友人が経営する京都のマフィン専門店にデータの使用をお願いしたところ快くOKしていただきました。

所さんの番組でも紹介されたりしているらしいので、近くにいかれたら皆さんもぜひ行ってみてください ☕✨

📝 お店のウェブサイト: マフィン専門店 MuffinGic地図

※ なお、今回は私も好きな「抹茶マーブルチョコマフィン」で動画をつくってみます。実際のページはこちら

準備する

まずは開発前の準備です。

AWSでアクセス情報を取得する

まずAWSAmazon Pollyが使えるようにするため、「アクセスキー」と「アクセスシークレットキー」を取得します。

以下の参考ページを参照して、Amazon Pollyへのアクセス情報を取得しておいてください。

📝 参考ページ: アクセス情報(IAM)を取得する

なお、権限は「AmazonPollyFullAccess」です

また、「アクセスキー」と「シークレットアクセスキー」は登録後に以下の部分から取得できます。

パッケージをインストールする

PythonAWS開発がしやすいようにboto3というパッケージをインストールしておきましょう。

以下のコマンドを実行してください。

pip3 install boto3

では、実際に開発していきましょう❗

AWSで音声を作成する

まずは、AWS Pollyテキストから音声をつくる部分です。
なお、今回はより細かく設定できる「SSML形式」で実行するようにします。

SSMLを使えば、例えば「音声を●秒ストップ」などの設定ができます。

text_to_audio.py

import boto3

# コンフィグ
AWS_ACCESS_KEY = '(ここにアクセスキー)'
AWS_SECRET_ACCESS_KEY = '(ここにシークレットアクセスキー)'
AWS_REGION = 'ap-northeast-1' # 東京 or `ap-northeast-3` 大阪

def generate(text, output_path, voice_id):
    client = boto3.Session(
            aws_access_key_id=AWS_ACCESS_KEY,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
            region_name=AWS_REGION
        ).client('polly')
    response = client.synthesize_speech(
            VoiceId=voice_id,
            OutputFormat='mp3',
            TextType='ssml',
            Text = text
        )
    file = open(output_path, 'wb')
    file.write(response['AudioStream'].read())
    file.close()

これで、同じ階層にpyファイルを作成すれば以下のようにして音声を作成することができます。

test.py

import text_to_audio as audio

text = """
<speak>
    抹茶マーブルチョコマフィン。
    <break time="1s"/>
    人気の抹茶シリーズの中でもお子様に人気のマフィンです。生地には抹茶とホワイトチョコを練り込み、しっとりした食感にしました。トップコートは見た目もかわいく、ついかぶりつきたくなるマフィンです。
</speak>
"""
output_path = 'introduction_speech.mp3'
voice_id = VOICE_ID = 'Mizuki' # もしくは `Takumi`
audio.generate(text, output_path, voice_id)

音声をBGMと合成する

さすがにAmazon Pollyでつくった音声だけでは少し寂しい動画になってしまうので、今回は「バックでBGMを流しながら音声で商品紹介をする」という音声ファイルをつくります。

BGMとして使わせていただくのはフリー素材として配布されている「at Will」という曲です。ウキウキ感があってとても気に入っています 👍

作曲者さん、ありがとうございます!m(_ _)m

📝 ダウンロードページ: DOVA-SYNDROME: at Will

では、先ほど作成した音声ファイルと、ダウンロードしたBGM をffmpegで合成するようにしてみます。

merge_audio.sh

#!/bin/sh

# 音声の長さ(秒を取得)
filename='introduction_speech.mp3'
duration=$(ffprobe -i $filename -show_format -v quiet | sed -n 's/duration=//p')
fade_out_start=$((${duration%.*} + 2))

# 音声とBGMを合成
ffmpeg \
-i introduction_speech.mp3 \
-i at_Will.mp3 \
-filter_complex \
   "[0]volume=6,adelay=1500|1500,apad=pad_dur=3 [fg]; \
    [1]volume=1,afade=t=out:st=${fade_out_start}:d=3 [bg]; \
    [fg][bg] amerge=inputs=2" \
-y introduction_speech_with_bgm.mp3

この中では2つの音声を合成するだけでなく、以下2つのエフェクトもつけています。

  • 音声を生成するタイミングを3秒遅らせる
  • 合成された音声ファイルの最後はフェードアウトする

これで、以下のようにすると音声 + BGMの合成ができるようになりました。

import os

command = 'bash merge_audio.sh'
os.system(command)

※ もちろん、普通にshファイルを実行してもOKです。

商品画像と合成された音声 + BGMで動画をつくる

それでは最終段階です。
以下2つのファイルを使って商品紹介動画をつくっていきます。

  • 音声 + BGM が合成された音声ファイル
  • 商品画像

generate_video.sh

#!/bin/sh

ffmpeg \
-y \
-loop 1 \
-i muffin.jpg \
-i introduction_speech_with_bgm.mp3 \
-s 1280:720 \
-vf "scale=-2:10*ih,zoompan=z='zoom+0.0005':d=1000:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'" \
-shortest \
introduction.mp4

この中でやっているのは、画像と音声をくっつける作業もそうですが、画像のズームインも実行しています。

これで、以下のようにすると動画の作成ができるようになりました。

command = 'bash generate_video.sh'
os.system(command)

これでコードは全て完了です。

テストしてみる:実際の動画あり!

では、実際に以下のコードで最初から最後まで一気に実行してみましょう❗

web_to_video.py

import os
import text_to_audio as audio

# テキスト → 音声化
text = """
<speak>
    抹茶マーブルチョコマフィン。
    <break time="1s"/>
    人気の抹茶シリーズの中でもお子様に人気のマフィンです。生地には抹茶とホワイトチョコを練り込み、しっとりした食感にしました。トップコートは見た目もかわいく、ついかぶりつきたくなるマフィンです。
</speak>
"""
output_path = 'introduction_speech.mp3'
voice_id = VOICE_ID = 'Mizuki' # もしくは `Takumi`
audio.generate(text, output_path, voice_id)

# 音声とBGM合成
command = 'bash merge_audio.sh'
os.system(command)

# 動画を作成
command = 'bash generate_video.sh'
os.system(command)

ファイルを作成したら以下のコマンドで実行します。

python3 web_to_video.py

すると・・・・・・(約10秒後)

うまくそれぞれのファイルが作成されました。
成功です。😊✨

それでは、実際に作成した動画をご覧ください。

↓ ↓ ↓

ちなみに:文章は、ほんの少し変更しました

どうやらAmazon Pollyの日本語化は「ニューラル」バージョンが使えず「スタンダード」しかなかったため(2021.05.23現在)、流暢な日本語音声にはならない部分がありました。(ニューラルは英語などしか対応していません)

そのため、商品紹介のテキストには読点を打つなどオリジナルの文章からは少し変更しています。

なお、ニューラルバージョンは料金が少し高いので注意が必要です。(100万文字フルに使っても、たった16ドルと考えると安いですけどね😂)

  • スタンダード: 100万文字(4.00 USD)
  • ニューラル: 100万文字(16.00 USD)

詳しくは以下のページをご覧ください。

📝 参考ページ: Amazon Polly 料金

企業様へのご提案

今回の技術を使えば、以下のような自動化を実装することができます。

  • 全商品データから動画を自動で作成し、YouTubeへ自動アップロード&個別ページで動画が見られるようにする
  • エラーが発生した商品名を含めてリアルタイムで音声化し、そのまま社内や工場内へアナウンスする。
  • コメントをつけた画像を複数用意し、それをつなぎ合わせることで作業ごとの「手順動画」をつくり教育用にする
  • リクルート用に会社案内動画をつくる(少し発音がたどたどしい部分もありますが、「この動画はAIで作成しています」と書いておくことで最先端技術を取り入れていることをアピールする)
  • これまで PowerPoint を使ってプレゼンテーションしていたものを動画化し、社員さんたちの作業を減らす

もし何か開発したいものがございましたら、お気軽にお問い合わせからご連絡ください。

開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回はPythonを + Shell Script使って商品ページを動画化してみました。

内容的にバラエティ検証番組のノリだったのでとても楽しく作業ができました👍

なお、久しぶりにPythonを使ってみましたが、やはりシンプルでいいですね。
それほど書き方は忘れてはいませんでした(ニッコリ)

逆に、Shell Scriptは、代入のときのの左右にスペースがあるとエラーになるなど、クセが強い部分を全く覚えておらず苦労しました。。。😫

たまに全く違う言語を触ってみるのも、その言語の「ノリ」みたいなものはそれぞれ違うので、きっとメイン言語のためになると思います。

ぜひ皆さんも挑戦してみてくださいね。

ではでは〜❗

「Gicはシフォンも
ウマウマでした👍」

このエントリーをはてなブックマークに追加       follow us in feedly