跳到文档
PAUTINKAAudio Motion System 1.0
返回 Pautinka
官方文档版本 1.0

Audio MotionSystem

面向 Unreal Engine 的音频驱动运行时运动、确定性 Choreography、可复用 Dialogue Curve 资源以及 Animation Sequence 混合。

引擎 UE 5.3–5.8 软件包 类型 C++ Code Plugin 运行时 Blueprint + C++ 编辑器 Tools → Audio Motion System
一个编辑器工具。可复用的运行时资源。 下面的 API 参考描述 AMS 1.0 的公共接口。不同引擎版本的软件包会尽可能保持相同的公共工作流程,仅包含必要的兼容性实现调整。
DOCS / 01

概览

AMS 的作用

生产工作流程

AMS 将音频分析转换为可复用数据和运行时控制。编辑器提供四个专用工作区,运行时模块则提供组件、资源、Blueprint 辅助函数和 C++ 接口。

音频分析Frame / Motion 数据映射预览 / 运行时 / Bake

四个工作区

01 Dialogue 02 Choreography 03 Dialogue Curve 04 Animation Mixer

预览用于快速迭代;最终结果通过可复用资源和运行时组件进入实际项目。

DOCS / 02

技术信息

插件 规格。

产品Pautinka - Audio Motion System
版本1.0
产品类型Unreal Engine Code Plugin
引擎软件包UE 5.3, 5.4, 5.5, 5.6, 5.7, 5.8
编辑器入口Tools → Audio Motion System
运行时访问Blueprint + C++
模块2 个 Runtime + 1 个 Editor
当前发布者验证平台Win64
第三方运行时库插件 Build.cs 中无
是否需要在线服务
内置数据Content/AMSData 下的 Vocabulary / 视图数据
生成输出根目录默认为 /Game/AudioMotion
引擎版本: Code Plugin 文件按 Unreal Engine 版本分别发布。请使用与项目引擎版本完全匹配的软件包。
本地化: 文档说明文字提供 10 种语言版本。为了与插件界面保持精确一致,公共 C++ 标识符、Blueprint 节点名称、资源名称以及 Unreal Editor 控件标签会保留英文。
GUIDE / 01

安装

进入工具 并正确开始。

FAB / 最终用户

安装引擎软件包

  1. 01将 AMS 添加到你的 Fab Library。
  2. 02在 Epic Games Launcher 中安装与目标 Unreal Engine 版本匹配的 AMS 软件包。
  3. 03打开项目并启用 Pautinka - Audio Motion System (如有提示)。
  4. 04如果插件激活需要,请重启编辑器。
  5. 05打开 Tools → Audio Motion System.
SOURCE / 开发

项目插件工作流程

  1. 01使用为对应 Unreal Engine 版本构建的源代码软件包。
  2. 02AudioMotionSystem 放到 [Project]/Plugins/.
  3. 03使用该引擎版本支持的工具链编译项目。
  4. 04不要复制 IntermediateSaved 文件夹到其他电脑。
Tools menu — Audio Motion System entry
编辑器入口。
GUIDE / 02

快速开始

第一次成功的 Preview。

  1. 01打开 Dialogue ,然后选择 Dialogue Profile 和 Dialogue Mapping。
  2. 02选择 Voice Sound 并准备其分析数据。
  3. 03选择目标 Rig Mesh,运行自动控件检测并检查分配结果。
  4. 04点击 播放预览 并在 Bake 或安装运行时设置之前验证结果。
  5. 05对于 Blueprint 运行时使用,请从 Connect Audio Motion 或已 Bake 的 Audio Motion Clip.
最快运行时路径Connect Audio MotionVoice Sound + Profile + Binding Profile
BAKED 运行时路径Connect Audio Motion Clip可复用的预计算 Dialogue 数据
WORKSPACE / 01

语音驱动控制

Dialogue 工作区。

设置

  1. 01选择或创建 Dialogue Profile 和 Binding Profile。
  2. 02选择 Voice Sound;Background Music 可选。
  3. 03准备语音分析。
  4. 04选择 Rig Mesh 并运行自动控件检测。
  5. 05检查分配并进行预览。

输出

  • AudioMotionClip — 可复用的预计算 Dialogue 帧数据。
  • Animation Sequence — 所选 Rig 的预计算结果。
  • 运行时组件设置 — 安装到所选 Actor。
  • 背景音乐 — 同步且独立的音乐播放路径。
Dialogue 工作区概览
Dialogue 设置与 Preview 工作流程。
WORKSPACE / 02

音乐驱动 Motion

Choreography 工作区。

确定性时间线

  1. 01选择 Vocabulary、目标 Rig Mesh 和 Rig Profile。
  2. 02选择 Mapping 模式和 Choreography Book。
  3. 03选择 Music Sound 和可选的 Dialogue 资源。
  4. 04设置 Intensity 和 Trajectory Mode。
  5. 05运行 Analyze + Build + Compile Choreography.
IN PLACE

抑制全局位移。

用于原地播放。
PLANNED

使用规划轨迹。

当序列需要移动时使用。
STABILIZED

使用稳定后的全局轨迹路径。

当规划位移需要稳定处理时使用。
Choreography 工作区概览
Choreography 规划与编译轨道工作流程。
Custom Rig Mapping
自动映射是起点;Custom Mapping 用于手动修正。
WORKSPACE / 03

标量输出

Dialogue Curve 工作区。

可移植运行时资源

创建 Audio Motion Dialogue Curve 当你需要用于 Blueprint 或材质参数的单个预计算标量值时使用。

输入 Min / Max输出 Min / MaxAttackRelease循环材质目标

运行时直接读取预计算曲线,无需重复编辑器分析。

运行时连接

Connect Dialogue Curve Asset 会在目标 Actor 上创建或复用 Audio Motion Dialogue Curve 组件,并使用资源设置启动它。

当前标量值可通过 Get Dialogue Curve Value。如果启用了材质输出,相同数值会写入所选标量参数。

Dialogue Curve 工作区
Dialogue Curve 制作与材质连接。
WORKSPACE / 04

Animation Sequence + Dialogue

Animation Mixer 工作区。

  1. 01选择目标 Rig Mesh、Dialogue 设置和 Voice Sound。
  2. 02向播放列表添加一个或多个 Animation Sequence。
  3. 03选择 Auto, Custom, or Profile 作为每个源配对的 retarget 模式。
  4. 04设置播放列表顺序、循环、交叉淡化、位移缩放和全局位移传递。
  5. 05先进行 Preview,然后使用 Bake Mixed Animation Sequence.
AUTO

根据参考层级和几何结构构建 Source-to-Target Mapping。

目标 Rig 的原生动画会跳过 retargeting。
CUSTOM

以 Auto 为基础,可替换或清除需要修正的 Mapping。

用于特殊或低置信度情况。
PROFILE

对已知 Source / Target 配对复用已保存的 Retarget Profile。

最适合重复的生产工作。
Animation Mixer 工作区
Animation Mixer 播放列表与 retarget 控件。
RUNTIME / 01

架构

模块与 数据流。

模块类型用途使用位置
AudioMotionRuntime运行时音频评估、组件、Blueprint 辅助函数、资源、Mapping 和 Choreography 数据。Game + Editor
AudioMotionAnimation运行时运行时 AnimGraph 控制节点。动画系统
AudioMotionEditor编辑器Tools 窗口、资源工厂、Preview、制作、Bake 和 Animation Mixer。仅编辑器
运行时依赖规则: Gameplay/runtime 模块应依赖 AudioMotionRuntime 并在需要时依赖 AudioMotionAnimation。不要添加 AudioMotionEditor 依赖到 shipping runtime 代码。

Dialogue 运行时路径

SoundWave / AudioComponent / Clip / Manual Envelope UAudioMotionComponent FAudioMotionFrame Binding Profile / Motion Sequence Target Actor / AnimGraph / Material

内置运行时数据

运行时模块会将紧凑的 AMS Vocabulary 与 view 文件从 Content/AMSData 作为 NonUFS 运行时依赖进行暂存。

*.amsvocab.json
*.amsvocabz
*.amsview.json

如果存在,运行时构建规则支持的项目侧 Vocabulary 文件夹也可以一起暂存。

API / BLUEPRINT

主要集成节点

Blueprint API.

Blueprint 辅助函数会在目标 Actor 上创建或复用 AMS 组件。必填输入会被验证;设置失败时返回 None / nullptr.

BlueprintCallable · Audio Motion

Connect Audio Motion

UAudioMotionComponent*

创建或复用主 Audio Motion Component,准备 Voice Sound 路径,重建 Dialogue bindings,连接目标 Rig 组件并开始处理。

必需
Target Actor, Profile, Binding Profile, Source Sound
高级
Target Rig Component, Play Audio = true, Loop = false
返回
返回已连接的 Audio Motion Component;若缺少必填输入则返回 None。
BlueprintCallable · Audio Motion

Connect Audio Motion Clip

UAudioMotionComponent*

将 baked Audio Motion Clip 连接到目标 Actor。此路径不需要播放源音频。

必需
Target Actor, Profile, Binding Profile, Source Clip
高级
Target Rig Component, Loop = false
输入模式
Audio Motion Clip
BlueprintCallable · Audio Motion | Music

Connect Audio Motion Music

UAudioMotionComponent*

将主组件配置为音乐驱动处理,并把所选 SoundWave 作为 Background Music。处理可以独立于 Voice 源继续运行。

必需
Target Actor, Profile, Binding Profile, Music Sound
高级
Target Rig Component, Loop = true
背景音乐
在处理开始时启动。
BlueprintCallable · Audio Motion | Music

Connect Audio Motion Dialogue + Choreography

UAudioMotionComponent*

将 Voice Sound 和独立 Background Music 连接到同一个 Audio Motion Component。当 Voice 播放停止后,组件仍继续处理,以便音乐路径继续运行。

必需
Target Actor, Profile, Binding Profile, Voice Sound, Music Sound
高级
Target Rig Component, Loop Music = true
BlueprintPure · Audio Motion

Get Audio Motion Component

UAudioMotionComponent*

查找目标 Actor 上第一个 Audio Motion Component;如果没有则返回 None。

BlueprintCallable · Dialogue Curve

Connect Dialogue Curve

UAudioMotionDialogueCurveComponent*

创建或复用 Dialogue Curve 组件,并将其标量输出连接到 Blueprint;默认情况下也连接到材质标量参数。

默认值
Parameter Name = DialogueCurve, Material Slot = 0
可选
Standalone Sound, Target Component Name
来源
优先使用现有的 Audio Motion Component;若不可用,也可使用可选的独立声音。
BlueprintCallable · Dialogue Curve

Connect Dialogue Curve Asset

UAudioMotionDialogueCurveComponent*

创建或复用 Dialogue Curve 组件,并应用完整生成的 Dialogue Curve 资源:源声音、baked 曲线、响应设置、循环状态、材质目标、材质槽和参数名称。

BlueprintCallable · Material Pulse

Connect Material Pulse

UAudioMotionPulseComponent*

创建或复用紧凑的标量 Audio Pulse 组件。来源可以是 Voice、整体音乐能量、频段、onset、beat 或自定义 Audio Motion 通道。

默认值
Source = Music Overall, Parameter Name = AudioPulse, Material Slot = 0
可选
Standalone Sound, Target Component Name
Blueprint 辅助节点
推荐的 Blueprint API 概览图。
API / COMPONENTS

运行时控制

组件 API.

UAudioMotionComponent主要运行时求值器

头文件: AudioMotionComponent.h · 模块: AudioMotionRuntime

SetAudioSource(UAudioComponent*)设置 Audio Component 输入并更新源状态。
SetSourceSound(USoundWave*)设置 SoundWave 源路径。
SetSourceClip(UAudioMotionClip*)设置 baked Audio Motion Clip 源。
StartProcessing(bool)开始评估;可选择重置播放时间。
StopProcessing(bool)停止评估;可选择停止源音频。
ResetProcessing(float)将处理器状态重置到指定时间。
PushEnvelopeValue(float)为 Manual Envelope 输入模式提供手动 envelope 值。
EvaluateAtTime(float,float)评估明确指定的时间和 envelope 值。
EvaluateSourceAtTime(float)在指定时间评估当前配置的源。
ApplyExternalFrame(FAudioMotionFrame,bool)应用预构建的 frame,并可选择应用自动 bindings。
RefreshAutomaticConnection()重新解析自动运行时目标连接。
ResetAutomaticBindings()清除缓存的自动 binding 状态。
SetTargetSkeletalMesh(...)为运行时应用明确设置目标 Rig 组件。
GetChannelValue(EAudioMotionChannel)从当前 frame 读取一个值。
GetPlaybackTimeSeconds()返回当前主播放时钟。
GetSourceDurationSeconds()可用时返回已配置源的时长。
IsProcessing()返回处理状态。
SetBackgroundMusic(...)设置独立的 Background Music SoundWave。
PlayBackgroundMusic(float)从指定的本地时间开始播放 Background Music。
StopBackgroundMusic()停止 Background Music 播放。
SetBackgroundMusicVolume(float)更新 Background Music 音量。
IsBackgroundMusicPlaying()返回 Background Music 播放状态。

Blueprint 事件

On Frame UpdatedOn Speech Value UpdatedOn Speech StartedOn Speech Stopped
UAudioMotionPulseComponent紧凑的音频标量输出

头文件: AudioMotionPulseComponent.h · 模块: AudioMotionRuntime

读取所选 AMS 通道或独立声音,通过 Input/Output 范围并结合 attack/release 平滑进行映射,可选择写入动态材质标量,并提供阈值事件。

StartPulse()开始 tick 和源评估。
StopPulse(bool)停止评估;可选择停止独立音频。
SetStandaloneSound(USoundWave*,bool)更改独立源,并可选择立即播放。
GetPulseValue()返回当前标量输出。

Blueprint 事件

On Pulse Value UpdatedOn Pulse
UAudioMotionDialogueCurveComponentBaked Dialogue Curve 播放

头文件: AudioMotionDialogueCurveComponent.h · 模块: AudioMotionRuntime

派生自 Audio Motion Pulse Component。分配 Curve Asset 后,其 baked 曲线成为标量源,并把播放/材质设置复制到组件。

SetCurveAsset(UAudioMotionDialogueCurveAsset*,bool)分配资源,并可选择启动其源声音。
GetDialogueCurveValue()返回当前 baked 曲线标量值。
API / C++

公共头文件

C++ API.

模块依赖

只添加你自己的代码实际使用的模块。

PublicDependencyModuleNames.AddRange(new[]
{
    "AudioMotionRuntime",
    "AudioMotionAnimation" // only when your runtime animation module needs FAnimNode_AudioMotion
});
仅编辑器: 添加 AudioMotionEditor 只能从 Editor 模块添加。不要让 shipping runtime 模块依赖 AMS Editor 模块。
公共类型头文件用途 / 主要公共 API
UAudioMotionComponentAudioMotionComponent.h主要运行时求值器:源选择、处理时钟、帧求值、自动连接、背景音乐和通道读取。
UAudioMotionBlueprintLibraryAudioMotionBlueprintLibrary.hBlueprint Connect 节点使用的静态便捷层,也可直接从 C++ 调用。
UAudioMotionProfileAudioMotionProfile.h包含 envelope、Dialogue、音乐和求值设置的 Primary Data Asset。
UAudioMotionBindingProfileAudioMotionBindingProfile.h用于目标 Mapping 的 Primary Data Asset。公共 helper:FindDialogueRole、EnsureDialogueRoles、RebuildDialogueBindings。
UAudioMotionClipAudioMotionClip.hBaked Dialogue 曲线。EvaluateChannel、EvaluateFrame、BuildFromFrames、ClearClip、IsEmpty。
UAudioMotionDialogueCurveAssetAudioMotionDialogueCurveAsset.h可移植标量曲线资源。EvaluateCurve 和 GetSourceSound。
UAudioMotionPulseComponentAudioMotionPulseComponent.h带材质输出和触发事件的标量音频反应组件。
UAudioMotionDialogueCurveComponentAudioMotionDialogueCurveComponent.h派生自 Pulse、用于求值 baked Dialogue Curve 资源的组件。
FAudioMotionDialogueProcessorAudioMotionDialogueProcessor.h确定性 Dialogue 处理器。Reset(seed)、Evaluate(...)。
FAudioMotionMusicAnalyzerAudioMotionMusicAnalyzer.h用于 SoundWave 或 Audio Component 求值的音乐分析 helper。
FAudioMotionFrameAudioMotionTypes.h共享帧容器。GetChannel / SetChannel,以及 Dialogue 和音乐通道值。
UAMSMotionDataSubsystemAMSMotionDataSubsystem.h加载紧凑 Vocabulary 数据的引擎 subsystem。ReloadData、GetVocabulary、GetDefaultVocabulary、GetVocabularyIds。
UAMSMotionVocabularyAMSMotionVocabulary.hVocabulary 元数据和 Motion 引用。FindMotion、GetMotionCount、ValidateVocabulary。
UAMSMotionClipAMSMotionClip.h测量得到的 Motion Unit 数据:轨道求值、pose 应用、authoring 验证和过渡元数据。
UAMSMotionLibraryAMSMotionLibrary.h由 Vocabulary 和 Book 数据构建、供 Planner 使用的候选库。
UAMSPerformanceBookAMSPerformanceBook.hChoreography 策略/语法 Data Asset,包含内置 Book helper、验证和 family rules。
FAMSPerformancePlannerAMSPerformancePlanner.h确定性的静态 BuildPlan 接口:Book/Library + Analysis + Planner Settings → Motion Sequence。
UAMSMotionSequenceAMSMotionSequence.h计划好的 Choreography sequence:持续时间/时间归一化、pose 求值、compiled track 构建与验证。
UAMSRigProfileAMSRigProfile.hRig Mapping 配置:解析 Mapping、从参考层级构建、手动 overrides、验证和参考比例。
FAnimNode_AudioMotionAnimNode_AudioMotion.hRuntime AnimGraph 控制节点,默认从所属的 Audio Motion Component 读取帧。
C++ 示例:连接运行时 Voice 处理AudioMotionRuntime
#include "AudioMotionBlueprintLibrary.h"
#include "AudioMotionComponent.h"

UAudioMotionComponent* ConnectAMS(
    AActor* TargetActor,
    UAudioMotionProfile* Profile,
    UAudioMotionBindingProfile* BindingProfile,
    USoundWave* VoiceSound)
{
    return UAudioMotionBlueprintLibrary::ConnectAudioMotion(
        TargetActor,
        Profile,
        BindingProfile,
        VoiceSound,
        nullptr,
        true,
        false);
}
C++ 示例:求值 baked Dialogue Curve 资源AudioMotionRuntime
#include "AudioMotionDialogueCurveAsset.h"

float ReadDialogueCurve(
    const UAudioMotionDialogueCurveAsset* CurveAsset,
    float TimeSeconds)
{
    return CurveAsset
        ? CurveAsset->EvaluateCurve(TimeSeconds, false)
        : 0.0f;
}
REFERENCE / 01

资源与数据类型

会被 保存。

Audio Motion Profile

Envelope、Dialogue、音乐分析和评估频率设置。

Audio Motion Binding Profile

目标 Mapping 与生成的 Dialogue bindings。

Audio Motion Clip

可复用的 baked 帧通道曲线。

Audio Motion Dialogue Curve

源 SoundWave、一个 baked 标量曲线以及材质设置。

AMS Rig Profile

Rig Mapping、手动 overrides、拓扑数据与参考比例。

AMS Motion Vocabulary

Vocabulary 元数据以及对 Motion Units 的引用。

AMS Motion Library

由 Vocabulary 和 Book 数据构建的 Planner 候选库。

AMS Choreography Book

Planner 使用的选择策略/语法。

AMS Motion Sequence

计划的 Choreography 条目和可选的编译轨道。

Animation Mixer Retarget Profile

保存可复用 Source/Target Mapping 与位移设置的 Editor 资源。

Blueprint 可见枚举AudioMotionTypes.h + AMS data headers
EAudioMotionModeEAudioMotionInputModeEAudioMotionChannelEAudioMotionPulseSourceEAudioMotionTransformChannelEAudioMotionTargetTypeEAudioMotionDialogueRoleEAudioMotionDialogueTargetTypeEAMSRigProfileKindEAMSMotionSequenceModeEAMSTrajectoryModeEAMSMotionCurveModeEAMSMotionActionKindEAMSMotionPathKindEAMSMotionDirectionEAMSMotionLevelEAMSMotionTimeQualityEAMSMotionForceQualityEAMSMotionFlowQualityEAMSSupportState

为保证 API 准确性,文档保留精确的 C++ 标识符。编辑器对主要面向生产的 Dialogue 角色使用中性显示标签。

核心 Blueprint 可见结构体数据交换 / 设置
FAudioMotionFrameFAudioMotionMusicSettingsFAudioMotionEnvelopeSettingsFAudioMotionDialogueSettingsFAudioMotionValueMappingFAudioMotionDialogueTargetConfigFAudioMotionDialogueRoleTargetFAudioMotionMorphBindingFAudioMotionMaterialScalarBindingFAudioMotionSceneBindingFAMSPerformanceAnalysisFAMSPerformancePlannerSettingsFAMSRigSlotMappingFAMSRigManualOverrideFAMSMotionKeyFAMSMotionTrack
REFERENCE / 02

资源安全

生成文件保持 井然有序。

按 Mesh 划分的文件夹

AMS 使用配置的 Output Folder 作为根目录。依赖 Mesh 的资源会保存在以所选 Rig Mesh 命名的文件夹中。

/Game/AudioMotion/
  SK_MyRig/
    Profiles/
    Clips/
    Animations/
    Retarget/
    Choreography/
      RigProfiles/
      Generated/
  DialogueCurves/

唯一的最终名称

生成的最终资源使用 Unreal 的唯一命名机制,不会静默覆盖已有资源。

AM_DialogueAM_Dialogue_1AM_Dialogue_2AM_Dialogue_3

Dialogue Curve 资源是共享的,不绑定到特定 Rig Mesh。

Content Browser 中的生成文件夹
推荐的生成资源组织结构截图。
SYSTEM / 01

兼容性

支持的工作流程 边界。

  • 使用为项目准确 Unreal Engine 版本构建的 AMS 软件包。
  • Auto Mapping 和 Auto Retarget 只是辅助工具;特殊的自定义 Rig 必须人工检查。
  • Retargeting 需要 Source 与 Target 结构足够兼容,才能表示所需运动。
  • Preview 与 Bake 设计为共享生产评估路径,但最终仍需测试打包后的项目。
  • 发布的运行时插件不需要源制作文件。
  • 内置共享 Motion 数据是公共的,不会复制到每个 Mesh 输出文件夹。
  • 运行时组件不定义项目特定的网络复制策略;多人项目应根据自身设计复制所需输入或结果。
SYSTEM / 02

故障排除

当某些内容 不动时。

Tools 中看不到 Audio Motion System。

确认项目已启用插件,并在激活后重启了编辑器。同时确认软件包与项目的 Unreal Engine 版本匹配。

Dialogue Preview 没有有效响应。

检查 Voice Sound 分析数据、Profile/Binding Profile 选择、目标 Rig Mesh 和自动分配。在重新构建或 Bake 前检查缺失或可疑的 Mapping。

Choreography 可以播放,但目标 Rig 结果不正确。

验证 Rig Profile。切换到 Custom Mapping,以自动结果为基础,只修正错误行,执行 Validate 和 Apply,然后重新构建已编译的 Choreography track。

选择 SoundWave 后 Music 分析不可用。

按照编辑器状态提示操作。当 AMS 启用所需分析设置后,保存 SoundWave,让 Unreal 重建音频分析数据,然后再次运行 Analyze + Build + Compile。

Dialogue Curve 未更新材质。

确认已启用材质输出、标量参数存在、Material Slot 正确,并且 Target Component Name 与目标 mesh 组件匹配;也可以留空,让 AMS 使用第一个合适的 mesh 组件。

Animation Mixer 的 retarget 结果需要修正。

使用 Custom 模式,以 Auto Mapping 为基础,只替换或清除错误行;如果 Source/Target 配对还会再次使用,请保存可复用的 Retarget Profile。

更换引擎版本后 C++ 项目无法编译。

安装/使用与该引擎版本完全匹配的 AMS 源代码软件包,并使用该版本支持的编译器/工具链重新构建。不要复用其他引擎版本的 Binaries 或 Intermediate 输出。

SUPPORT

Pautinka

支持与 问题报告。

提交报告之前

请提供 Unreal Engine 版本、AMS 版本、问题出现于 Editor Preview / Runtime / Bake 中的哪个环节、准确复现步骤以及相关 Unreal 日志片段。

对于 Mapping 或 Animation Mixer 问题,还请提供 Source/Target Rig 类型以及使用的是 Auto、Custom 还是 Profile 模式。

PAUTINKA — AUDIO MOTION SYSTEM 1.0

音频输入。 Motion 输出。

将 Editor 制作、可复用资源、Blueprint 集成和公共 C++ 运行时 API 汇集到一个生产工作流程中。

Pautinka Digital Develop Studio