+
18
-

python如何ai将一个知识点生成带声音的视频讲解动画?

python如何ai将一个知识点生成带声音的视频讲解动画?

800_auto

网友回复

+
28
-

可以使用p5等动画插件写一个html,然后录制动画

800_auto

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>正弦函数动画解释</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <script src="https://cdn.jsdelivr.net/npm/p5@1.5.0/lib/p5.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
    <script>
        tailwind.config = {
            theme: {
                extend: {
                    colors: {
                        primary: '#165DFF',
                        secondary: '#FF7D00',
                        dark: '#1D2129',
                        light: '#F2F3F5'
                    },
                    fontFamily: {
                        inter: ['Inter', 'system-ui', 'sans-serif'],
                    },
                }
            }
        }
    </script>
    <style type="text/tailwindcss">
        @layer utilities {
            .content-auto {
                content-visibility: auto;
            }
            .text-shadow {
                text-shadow: 0 2px 4px rgba(0,0,0,0.1);
            }
            .transition-all-300 {
                transition: all 300ms ease-in-out;
            }
        }
    </style>
</head>
<body class="bg-gradient-to-br from-light to-gray-100 font-inter text-dark min-h-screen flex flex-col">
    <header class="bg-white shadow-md sticky top-0 z-50">
        <div class="container mx-auto px-4 py-4 flex justify-between items-center">
            <h1 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-primary">
                <i class="fa fa-superscript mr-2"></i>数学可视化:正弦函数
            </h1>
            <div class="flex items-center space-x-4">
                <button id="playPauseBtn" class="bg-primary hover:bg-primary/90 text-white px-4 py-2 rounded-lg shadow transition-all-300 flex items-center">
                    <i class="fa fa-play mr-2" id="playIcon"></i>
                    <span id="playBtnText">播放解说</span>
                </button>
                <button id="fullscreenBtn" class="bg-secondary hover:bg-secondary/90 text-white px-4 py-2 rounded-lg shadow transition-all-300">
                    <i class="fa fa-expand mr-2"></i>全屏
                </button>
            </div>
        </div>
    </header>

    <main class="flex-grow container mx-auto px-4 py-8 grid grid-cols-1 lg:grid-cols-3 gap-8">
        <div class="lg:col-span-2 bg-white rounded-xl shadow-lg overflow-hidden">
            <div class="relative" style="padding-bottom: 56.25%;">
                <div id="p5Container" class="absolute inset-0"></div>
            </div>
        </div>

        <div class="lg:col-span-1 bg-white rounded-xl shadow-lg p-6 flex flex-col">
            <h2 class="text-2xl font-bold mb-4 text-primary border-b pb-2">正弦函数解说</h2>
            
            <div id="transcript" class="flex-grow overflow-y-auto mb-6">
                <div class="mb-4">
                    <p class="text-lg font-semibold text-primary">1. 基本定义</p>
                    <p class="text-dark/80">正弦函数(sin)是三角函数的一种,表示直角三角形中对边与斜边的比值。在单位圆上,正弦值等于点的y坐标。</p>
                </div>
                
                <div class="mb-4">
                    <p class="text-lg font-semibold text-primary">2. 波形特征</p>
                    <p class="text-dark/80">正弦波是周期性的,其形状在时间或空间上重复。它的周期是2π,意味着每经过2π的间隔,波形就会重复一次。</p>
                </div>
                
                <div class="mb-4">
                    <p class="text-lg font-semibold text-primary">3. 关键参数</p>
                    <p class="text-dark/80">振幅(Amplitude)决定了波形的高度,频率(Frequency)决定了波形的密集程度,相位(Phase)决定了波形的起始位置。</p>
                </div>
                
                <div class="mb-4">
                    <p class="text-lg font-semibold text-primary">4. 应用领域</p>
                    <p class="text-dark/80">正弦函数在物理学、工程学、信号处理、音乐等领域有广泛应用,例如描述振动、交流电、声波等。</p>
                </div>
            </div>
            
            <div class="space-y-4">
                <div class="bg-light rounded-lg p-4">
                    <h3 class="font-semibold mb-2">控制参数</h3>
                    <div class="space-y-3">
                        <div>
                            <label class="block text-sm font-medium text-dark/70 mb-1">振幅 (A)</label>
                            <input type="range" id="amplitudeSlider" min="0.1" max="2" step="0.1" value="1" class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-primary">
                            <div class="flex justify-between text-xs text-dark/60">
                                <span>0.1</span>
                                <span id="amplitudeValue">1.0</span>
                                <span>2.0</span>
                            </div>
                        </div>
                        
                        <div>
                            <label class="block text-sm font-medium text-dark/70 mb-1">频率 (ω)</label>
                            <input type="range" id="frequencySlider" min="0.1" max="2" step="0.1" value="1" class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-primary">
                            <div class="flex justify-between text-xs text-dark/60">
                                <span>0.1</span>
                                <span id="frequencyValue">1.0</span>
                                <span>2.0</span>
                            </div>
                        </div>
                        
                        <div>
                            <label class="block text-sm font-medium text-dark/70 mb-1">相位 (φ)</label>
                            <input type="range" id="phaseSlider" min="0" max="6.28" step="0.1" value="0" class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-primary">
                            <div class="flex justify-between text-xs text-dark/60">
                                <span>0</span>
                                <span id="phaseValue">0.0</span>
                                <span>2π</span>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="text-center">
                    <button id="resetBtn" class="bg-gray-200 hover:bg-gray-300 text-dark px-4 py-2 r...

点击查看剩余70%

+
12
-

python中可以使用Manim或Matplotlib

我们用ManimCE (Community Edition) 编写正弦函数介绍动画的示例代码。

这个动画将包括:

标题介绍。

展示单位圆。

在单位圆上动态显示一个点 P,并标出角度 θ。

强调点 P 的 y 坐标即为 sin(θ)。

将单位圆上的点 P 的 y 坐标映射到右侧的坐标系中,动态绘制出正弦函数图像。

标注一些关键点,如周期。

前提条件:

你已经安装好了 ManimCE (Community Edition)。

你已经安装了 LaTeX (如 MiKTeX, MacTeX, TeX Live) 和 FFmpeg。

from manim import *
import numpy as np

class SineFunctionIntroduction(Scene):
    def construct(self):
        # 0. 配置和初始文本
        self.camera.background_color = WHITE # 白色背景
        default_font_size = 24
        Text.set_default(font_size=default_font_size, color=BLACK)
        MathTex.set_default(font_size=default_font_size, color=BLACK)
        Line.set_default(color=BLACK)
        Dot.set_default(color=BLACK)
        # 有些全局设置在 VGroup 或特定对象中设置更安全

        # 1. 标题
        title = Text("正弦函数 (Sine Function)", font_size=48, color=BLUE_E)
        self.play(Write(title))
        self.wait(1)
        self.play(FadeOut(title))
        self.wait(0.5)

        # 2. 创建单位圆和相关元素
        # 单位圆坐标系
        unit_circle_axes = Axes(
            x_range=[-1.5, 1.5, 1],
            y_range=[-1.5, 1.5, 1],
            x_length=4,
            y_length=4,
            axis_config={"color": GRAY, "include_tip": False}
        ).to_edge(LEFT, buff=1)
        unit_circle_axes.add_coordinates(font_size=20, color=GRAY) # 添加坐标轴刻度

        # 单位圆
        circle = Circle(radius=unit_circle_axes.x_range[1] * unit_circle_axes.x_length / (unit_circle_axes.x_range[1]-unit_circle_axes.x_range[0]),
                        color=BLUE_D, stroke_width=2) # 根据坐标轴长度调整圆的实际半径
        circle.move_to(unit_circle_axes.c2p(0,0)) # 将圆心移动到坐标原点

        # 标签:单位圆
        circle_label = Text("单位圆 (Unit Circle)", font_size=20, color=DARK_GRAY)
        circle_label.next_to(unit_circle_axes, DOWN, buff=0.2)

        self.play(Create(unit_circle_axes), Create(circle), Write(circle_label))
        self.wait(1)

        # 3. 动态点 P, 角度 theta, 和 y 坐标
        theta_tracker = ValueTracker(0) # 追踪角度 theta

        # 点 P 在单位圆上
        dot_p = Dot(color=RED_D, radius=0.08)
        dot_p.add_updater(
            lambda m: m.move_to(
                unit_circle_axes.c2p(
                    np.cos(theta_tracker.get_value()),
                    np.sin(theta_tracker.get_value())
                )
            )
        )

        # 半径 OP
        radius_op = Line(unit_circle_axes.c2p(0,0), dot_p.get_center(), color=GREEN_D, stroke_width=2)
        radius_op.add_updater(lambda m: m.put_start_and_end_on(unit_circle_axes.c2p(0,0), dot_p.get_center()))

        # 角度弧线和标签
        angle_arc = Arc(
            radius=0.4, # 弧线半径
            start_angle=0,
            angle=theta_tracker.get_value(),
            color=ORANGE,
            arc_center=unit_circle_axes.c2p(0,0)
        )
        angle_arc.add_updater(
            lambda m: m.become(
                Arc(
                    radius=0.4, start_angle=0, angle=theta_tracker.get_value(),
                    color=ORANGE, arc_center=unit_circle_axes.c2p(0,0)
                )
            )
        )
        theta_label = MathTex(r"\theta", font_size=28, color=ORANGE)
        theta_label.add_updater(
            lambda m: m.move_to(
                Arc(radius=0.6, start_angle=0, angle=theta_tracker.get_value()).point_from_proportion(0.5)
...

点击查看剩余70%

我知道答案,我要回答