<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python | POがITでラクする仕事術</title>
	<atom:link href="https://shoelab.jp/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://shoelab.jp</link>
	<description>ノンプログラマーでも簡単！GASと無料ツールで業務効率化を実現</description>
	<lastBuildDate>Sat, 16 Aug 2025 03:03:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://shoelab.jp/wp-content/uploads/2024/02/cropped-e14debba4b651ab77c82b66fca4377bf-32x32.png</url>
	<title>Python | POがITでラクする仕事術</title>
	<link>https://shoelab.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python＋gTTS＋MoviePyでブログ記事を自動ナレーション動画化する方法</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/python%ef%bc%8bgtts%ef%bc%8bmoviepy%e3%81%a7%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e3%82%92%e8%87%aa%e5%8b%95%e3%83%8a%e3%83%ac%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%8b%95%e7%94%bb%e5%8c%96/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sat, 16 Aug 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=702</guid>

					<description><![CDATA[こんにちは、イカPOです。 今回は 「ChatGPTとPythonを組み合わせて、画像とナレーションから自動で動画を作る方法」 を紹介します。 記事を ChatGPT で要約し、台本化したテキストを gTTS でナレーシ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。</p>



<p>今回は <strong>「ChatGPTとPythonを組み合わせて、画像とナレーションから自動で動画を作る方法」</strong> を紹介します。</p>



<p>記事を ChatGPT で要約し、台本化したテキストを gTTS でナレーション音声に変換。その音声とスライド画像を MoviePy で結合すれば、ワンクリックで動画が完成します。</p>



<p>手順はシンプルで、</p>



<ol class="wp-block-list">
<li>スライドを用意する</li>



<li>原稿を用意する</li>



<li>Python スクリプトを実行する<br>──これだけです。</li>
</ol>



<p>スライド内容の要約や原稿作成は ChatGPT に任せれば、制作スピードは一気に加速。発表のアーカイブや、社内向けの教育・共有コンテンツを短時間で動画化したい場面に最適です。</p>



<p>さらに記事内には <strong>サンプルコードとZIPファイル（bat付き）</strong> を添付しています。Pythonさえインストールすれば、そのまま実行できる仕組みになっていますので、ぜひ試してみてください。</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1755318949" id="download-link-710" data-redirect="false" >
	サンプルコード	(0 ダウンロード	)
</a>




<hr class="wp-block-separator has-alpha-channel-opacity"/>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ライブラリ紹介 — gTTS と MoviePy をかんたん解説</a><ol><li><a href="#toc2" tabindex="0">gTTS（Google Text-to-Speech）</a></li><li><a href="#toc3" tabindex="0">MoviePy（Pythonで動画編集まるごと）</a><ol><ol><li><a href="#toc4" tabindex="0">サンプルコード（画像→動画）</a><ol><li><a href="#toc5" tabindex="0">ディレクトリ構成（最小）</a></li></ol></li></ol></li></ol></li></ol></li><li><a href="#toc6" tabindex="0">実装編。画像とナレーションテキストを用意して動画をつくろう</a><ol><li><a href="#toc7" tabindex="0">コードを動かすのに必要なものリスト</a></li><li><a href="#toc8" tabindex="0">ディレクトリ構成（最小）</a></li><li><a href="#toc9" tabindex="0">サンプルコード</a></li><li><a href="#toc10" tabindex="0">メモ（調整ポイントだけ）</a><ol><li><a href="#toc11" tabindex="0">画像ついての注意点</a></li></ol></li></ol></li><li><a href="#toc12" tabindex="0">簡単に実行手順</a><ol><ol><li><a href="#toc13" tabindex="0">ナレーションテキストのルール</a><ol><li><a href="#toc14" tabindex="0">サンプル（input/narration.txt の例）</a></li></ol></li></ol></li></ol></li><li><a href="#toc15" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ライブラリ紹介 — gTTS と MoviePy をかんたん解説</span></h2>



<ul class="wp-block-list">
<li><strong>gTTS</strong>：文章→音声への変換が得意。声のイントネーションや句読点もキレイに反映してくれるのが最高。</li>



<li><strong>MoviePy</strong>：動画編集がコードで完結。Slidesスライドの結合〜ナレーションとの合体まで、一気に処理できる優れもの。</li>
</ul>



<p>どちらも「自動化」「再現性」「テキスト軸」の強みがあって、<strong>記事やスライドから動画コンテンツを自動生成したい</strong>って人には超おすすめです。</p>



<h3 class="wp-block-heading"><span id="toc2">gTTS（Google Text-to-Speech）</span></h3>



<p>Google 翻訳の読み上げ機能を Python から扱えるライブラリで、文章をそのまま <strong>MP3音声ファイル</strong> に変換できます。<br><code>lang="ja"</code> を指定すれば日本語の読み上げも可能で、句読点を多めに入れるとより自然な読み上げになります。<br>軽量で導入が簡単であり、読み仮名や略語の補正など前処理で発音をコントロールできる点も特徴です。</p>



<p>インストールはターミナルまたはコマンドプロンプトで</p>



<pre class="wp-block-code"><code>pip install gTTS</code></pre>



<p>と入力するだけです。<br>例えば、以下のコードで簡単に音声ファイルが作成できます。</p>



<pre class="wp-block-code"><code>from gtts import gTTS
tts = gTTS("こんにちは、ブログを音声にします。", lang="ja")
tts.save("output.mp3")</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc3">MoviePy（Pythonで動画編集まるごと）</span></h3>



<p>Python で動画編集を自動化できるライブラリです。カット、連結、タイトル挿入、音声合成、速度変更などをスクリプトでまとめて処理できます。<br>GIF や MP4 など多数のフォーマットに対応し、裏では ffmpeg を利用して高品質な動画を生成します。直感的な API で、数行のコードでも複雑な編集が可能です。</p>



<p>インストールはターミナルまたはコマンドプロンプトで</p>



<pre class="wp-block-code"><code>pip install moviepy</code></pre>



<p>としますが、もし</p>



<pre class="wp-block-code"><code>ModuleNotFoundError: No module named 'moviepy.editor'</code></pre>



<p>というエラーが出た場合は、安定して動くこちらのバージョンを使ってください。</p>



<pre class="wp-block-code"><code>pip install moviepy==2.0.0.dev2</code></pre>



<h5 class="wp-block-heading"><span id="toc4">サンプルコード（画像→動画）</span></h5>



<p>まず、<strong>ダミー画像</strong>をダウンロードして、スクリプトと同じフォルダに置きます。<br><a target="_blank" href="https://shoelab.jp/wp-content/uploads/2025/08/dummy_image.png">📷 dummy_image.png をダウンロード</a></p>



<p>そのうえで、以下のコードを <code>img_to_video.py</code> として保存し、実行します。</p>



<pre class="wp-block-code"><code># img_to_video.py
from moviepy.editor import ImageClip

# ダミー画像（同一フォルダの dummy_image.png）を5秒の動画に変換
clip = ImageClip("dummy_image.png").set_duration(5)

# mp4として出力（24fps）
clip.write_videofile("result_from_image.mp4", fps=24)
</code></pre>



<h6 class="wp-block-heading"><span id="toc5">ディレクトリ構成（最小）</span></h6>



<pre class="wp-block-code"><code>moviepy_image_sample/
├─ img_to_video.py # コード
├─ dummy_image.png      # ← ダウンロードした画像をここに置く
└─ result_from_image.mp4  # 実行後に生成</code></pre>



<p><br>こんな感じのディレクトリ構成でサンプルは動きます。<br>了解。<strong>実装編</strong>を「必要なもの」中心に再構成しました。サンプルコードは出さず、**ディレクトリ構成（最小）**だけ掲載しています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc6">実装編。画像とナレーションテキストを用意して動画をつくろう</span></h2>



<p>実際に画像とナレーションを用意して動画を作る方法を紹介します。サンプルコードも用意しているので試しに動かしてみてください。記事の最後にクリックで動くbat付きZIＰファイルを用意してるので、そちらも参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc7">コードを動かすのに必要なものリスト</span></h3>



<ul class="wp-block-list">
<li><strong>Python 3.11</strong><br>本ワークフローは 3.11 系で動作確認しています。</li>



<li><strong><code>main_simple.py</code></strong><br>この記事で配布しているスクリプト。<code>narration.txt</code> の本文をそのまま gTTS で読み上げます。</li>



<li><strong>ナレーションテキスト</strong>（<code>input/narration.txt</code>）<br>セクションは <code>#</code> で区切り、<strong>1行目がタイトル／2行目以降が本文</strong>。本文が音声になります。</li>



<li><strong>画像（任意）</strong><br><code>input/slide_0.png</code>, <code>input/slide_1.jpg</code>… のように番号付きで置くと、そのセクションの静止画として差し込みます。画像が無いセクションは自動生成のタイトルカード（黒地＋タイトル）になります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8">ディレクトリ構成（最小）</span></h3>



<pre class="wp-block-code"><code>project/
├─ main.py
├─ input/
│  ├─ narration.txt      # 原稿（本文）— 「#」で区切り、1行目=タイトル／以降=本文
│  ├─ slide_0.png        # 任意：セクション0の画像
│  └─ slide_1.jpg        # 任意：セクション1の画像…
├─ output/               # 自動出力（final_video.mp4）
└─ temp/                 # 中間ファイル（音声など）
</code></pre>



<h3 class="wp-block-heading"><span id="toc9">サンプルコード</span></h3>



<pre class="wp-block-code"><code>import os
from gtts import gTTS
from moviepy.editor import (
    AudioFileClip, ImageClip, CompositeVideoClip, ColorClip,
    concatenate_videoclips, vfx
)
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import contextlib

# ===== 設定 =====
INPUT_DIR  = "input"
OUTPUT_DIR = "output"
TEMP_DIR   = "temp"
SIZE       = (1280, 720)
FPS        = 24

os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(TEMP_DIR, exist_ok=True)

# ===== タイトル画像生成（スライドが無い場合用） =====
def make_title_clip(title: str, duration: float, size=SIZE):
    w, h = size
    img = Image.new("RGB", size, (0, 0, 0))
    draw = ImageDraw.Draw(img)

    font_candidates = &#091;
        "Yu Gothic UI.ttf", "YuGothR.ttc", "Meiryo.ttc",
        "/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc",
    ]
    font = None
    for path in font_candidates:
        try:
            font = ImageFont.truetype(path, size=64)
            break
        except:
            pass
    if font is None:
        font = ImageFont.load_default()

    max_w = int(w * 0.9)
    lines, line = &#091;], ""
    for ch in title:
        tw, _ = draw.textbbox((0, 0), line + ch, font=font)&#091;2:]
        if tw &lt;= max_w:
            line += ch
        else:
            lines.append(line)
            line = ch
    if line:
        lines.append(line)

    total_h = sum(draw.textbbox((0, 0), l, font=font)&#091;3] for l in lines) + 10 * (len(lines) - 1)
    y = (h - total_h) // 2
    for l in lines:
        _, _, tw, th = draw.textbbox((0, 0), l, font=font)
        x = (w - tw) // 2
        draw.text((x, y), l, fill=(255, 255, 255), font=font)
        y += th + 10

    return ImageClip(np.array(img)).set_duration(duration)

def find_slide_image(index: int):
    for ext in (".png", ".jpg", ".jpeg", ".webp"):
        p = os.path.join(INPUT_DIR, f"slide_{index}{ext}")
        if os.path.exists(p):
            return p
    return None

# ===== 原稿読み込み =====
with open(os.path.join(INPUT_DIR, "narration.txt"), "r", encoding="utf-8") as f:
    raw = f.read()

# 「#」区切りでセクション分割
sections = &#091;s.strip() for s in raw.split("#") if s.strip()]

video_clips = &#091;]

for i, section in enumerate(sections):
    lines = section.splitlines()
    if not lines:
        continue

    title = lines&#091;0].strip()
    body = "\n".join(lines&#091;1:]).strip()
    if not body:
        continue

    # 音声生成
    voice_path = os.path.join(TEMP_DIR, f"voice_{i}.mp3")
    tts = gTTS(body, lang="ja")
    tts.save(voice_path)

    audio_clip = AudioFileClip(voice_path)
    duration = audio_clip.duration

    # 画像
    image_path = find_slide_image(i)
    if image_path:
        img_clip = ImageClip(image_path).set_duration(duration)
    else:
        bg = ColorClip(size=SIZE, color=(0, 0, 0), duration=duration)
        title_clip = make_title_clip(title, duration)
        img_clip = CompositeVideoClip(&#091;bg, title_clip.set_position("center")], size=SIZE).set_duration(duration)

    clip = img_clip.set_audio(audio_clip)
    video_clips.append((clip, audio_clip))

# ===== 出力 =====
if not video_clips:
    raise RuntimeError("動画にできるクリップがありません。")

final = concatenate_videoclips(&#091;vc for vc, _ in video_clips], method="compose")
final = final.fx(vfx.speedx, 1.5)

out_path = os.path.join(OUTPUT_DIR, "final_video.mp4")
final.write_videofile(out_path, fps=FPS)

# 後片付け
with contextlib.suppress(Exception):
    final.close()
for vc, ac in video_clips:
    with contextlib.suppress(Exception):
        vc.close()
        ac.close()

print(f"&#091;done] {out_path}")</code></pre>



<h3 class="wp-block-heading"><span id="toc10">メモ（調整ポイントだけ）</span></h3>



<ul class="wp-block-list">
<li><strong>再生速度</strong>は <code>main.py</code> の終盤、<code>vfx.speedx(1.5)</code> の係数を変更（等速=1.0）。</li>



<li><strong>出力サイズ</strong>は <code>SIZE = (1280, 720)</code> を変更（例：縦動画は <code>(720, 1280)</code>）。</li>
</ul>



<p>以上を揃えれば、原稿と画像を置くだけで動画が書き出せます。</p>



<h4 class="wp-block-heading"><span id="toc11">画像ついての注意点</span></h4>



<div class="wp-block-group is-style-alert-box is-layout-constrained wp-block-group-is-layout-constrained">
<p><strong>画像ファイルは必ず連番で命名</strong><br>例：<code>slide_0.png</code>, <code>slide_1.jpg</code>, <code>slide_2.png</code> …</p>



<p><strong>slide_0 は特別枠（タイトル用）</strong></p>



<ul class="wp-block-list">
<li><code>slide_0.xxx</code> があれば冒頭のタイトルシーンに使われます</li>



<li>無ければ自動で黒背景＋タイトルテキストが生成されます</li>
</ul>



<p><strong>slide_1 以降が本文のスライド</strong></p>



<ul class="wp-block-list">
<li>それぞれのセクションに対応</li>



<li>拡張子は <code>.png</code>, <code>.jpg</code>, <code>.jpeg</code>, <code>.webp</code> のいずれでもOK</li>
</ul>



<p><strong>スライドが存在しない場合</strong></p>



<ul class="wp-block-list">
<li>そのセクションは黒背景＋タイトルテキストが表示されます</li>
</ul>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc12">簡単に実行手順</span></h2>



<p>Pythonの知識は不要です。ZIPを解凍して下記の順に進めるだけでOK。</p>



<p>サンプルコードはこちら</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1755318949" id="download-link-710" data-redirect="false" >
	サンプルコード	(0 ダウンロード	)
</a>




<ol class="wp-block-list">
<li><strong>Python 3.11 をインストール</strong>
<ul class="wp-block-list">
<li><a rel="nofollow noopener" target="_blank" href="https://www.python.org/downloads/release/python-3119/">公式サイト</a>から入手</li>



<li>インストール時に「Add Python to PATH」に必ずチェック</li>



<li>確認：<code>python --version</code> → <code>Python 3.13.x</code> と表示されればOK</li>
</ul>
</li>



<li><strong>添付のZIPファイルを解凍</strong><br>解凍後のフォルダに <code>main.py</code>、<code>run.bat</code>、<code>input</code> フォルダがあります。</li>



<li><strong>ナレーションテキストに原稿を貼る</strong>
<ul class="wp-block-list">
<li><code>input/narration.txt</code> に動画化したい原稿を貼り付け</li>



<li># 原稿（本文）— 「#」で区切りで</li>
</ul>
</li>



<li><strong>スライド画像を入れる</strong>
<ul class="wp-block-list">
<li><code>input/slide_0.png</code>、<code>input/slide_1.jpg</code>… の形式で置くと、そのシーンに反映</li>



<li>無ければ自動でタイトルカード生成</li>
</ul>
</li>



<li><strong><code>run.bat</code> をクリック</strong>
<ul class="wp-block-list">
<li>初回は必要なライブラリが自動インストールされます</li>



<li>完成動画は <code>output/final_video.mp4</code> に出力</li>
</ul>
</li>
</ol>



<h4 class="wp-block-heading"><span id="toc13">ナレーションテキストのルール</span></h4>



<ol class="wp-block-list">
<li><strong>区切りは「#」</strong>
<ul class="wp-block-list">
<li>各セクションは <code>#</code> から始めます。</li>



<li><code>#</code> の行は「スライドタイトル」になり、動画に表示されます。</li>
</ul>
</li>



<li><strong>読み上げは本文のみ</strong>
<ul class="wp-block-list">
<li><code>#</code> 行（スライドタイトル）は読み上げません。</li>



<li>読ませたい場合は、タイトルを本文にも書きます。</li>
</ul>
</li>



<li><strong>空行は無視</strong>
<ul class="wp-block-list">
<li>空白行は自動的にスキップされます。</li>
</ul>
</li>



<li><strong>日本語はそのまま書けばOK</strong>
<ul class="wp-block-list">
<li>gTTS が自然に読み上げます。</li>



<li>読みにくい場合は句読点（、。）を増やすと自然になります。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading"><span id="toc14">サンプル（input/narration.txt の例）</span></h5>



<pre class="wp-block-code"><code># はじめに
はじめに
この動画では Python と MoviePy を使って、
画像とナレーションから動画を自動生成する方法を紹介します。

# ライブラリについて
ライブラリについて
まず gTTS で日本語音声を生成し、
MoviePy で動画に合成します。

# まとめ
まとめ
Python と数行のコードで、
スライドつきのナレーション動画が作成できます。
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc15">まとめ</span></h2>



<p>ChatGPTで作成した原稿を gTTS で音声化し、MoviePy で画像と結合することで、誰でも手軽にスライド付きの動画を自動生成できます。画像がなくても自動でタイトルカードを生成でき、速度やサイズもコードの一部を変えるだけで調整可能です。発表のアーカイブや社内資料の動画化など、時短に役立つワークフローなのでぜひ活用してみてください。</p>



<p>サンプルコードはこちらから</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1755318949" id="download-link-710" data-redirect="false" >
	サンプルコード	(0 ダウンロード	)
</a>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
