好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 meiliyitian 于 2024-9-10 09:24 编辑
一个在Adobe After Effects 2020中自动裁剪气口的脚本。
由于AI配音中间的气口经常(可以说99%)对应不上画面,每次都是手动裁剪分段,短的只有一两句还好,稍微长一点就麻烦死了。利用GPT写了一个自动裁剪气口的脚本。
解压密码:52pj
功能:
1、按照设定自动在气口处裁剪;
2、裁剪时按照设定直接全部+XXdb。
使用方法:
1、首先选中需要裁剪的图层右键-关键帧辅助-将音频转换为关键帧;
2、同时选中需要裁剪的图层和生成的音频振幅图层;
3、点击脚本运行按钮。
源代码如下:
[Java] 纯文本查看 复制代码 function showUI() {
// 创建一个窗口
var win = new Window("palette", "气口自动裁剪", undefined);
win.orientation = "column";
// 静音阈值输入
var silenceGroup = win.add("group");
silenceGroup.add("statictext", undefined, "静音阈值 (默认为1):");
var silenceInput = silenceGroup.add("edittext", undefined, "1");
silenceInput.characters = 5;
// 气口间隔输入
var intervalGroup = win.add("group");
intervalGroup.add("statictext", undefined, "气口最小间隔 (数值内的气口不切割):");
var intervalInput = intervalGroup.add("edittext", undefined, "0.3");
intervalInput.characters = 5;
// 音频增益输入
var gainGroup = win.add("group");
gainGroup.add("statictext", undefined, "音频增益 (加多少音量):");
var gainInput = gainGroup.add("edittext", undefined, "0");
gainInput.characters = 5;
// 按钮
var runButton = win.add("button", undefined, "运行");
runButton.onClick = function() {
var silenceThreshold = parseFloat(silenceInput.text);
var minInterval = parseFloat(intervalInput.text);
var gainValue = parseFloat(gainInput.text);
if (isNaN(silenceThreshold) || isNaN(minInterval) || isNaN(gainValue)) {
alert("请确保输入正确的数值!");
return;
}
splitAudioByAmplitude(silenceThreshold, minInterval, gainValue);
// 运行后不关闭窗口
// win.close(); // 不调用关闭函数
};
win.center();
win.show();
}
function splitAudioByAmplitude(silenceThreshold, minInterval, gainValue) {
// 确保用户选择了合成
if (app.project.activeItem == null || !(app.project.activeItem instanceof CompItem)) {
alert("请先选择一个合成!");
return;
}
var comp = app.project.activeItem; // 当前合成
var layers = comp.selectedLayers; // 获取选中的图层
if (layers.length < 2) {
alert("请确保选中了音频图层和生成的音频振幅图层!");
return;
}
app.beginUndoGroup("Split Audio by Amplitude");
var audioLayer = null;
var audioAmplitudeLayer = null;
// 遍历选中的图层,识别音频图层和音频振幅图层
for (var i = 0; i < layers.length; i++) {
var layer = layers[i];
// 使用图层名称区分振幅图层和音频图层
if (layer.name.toLowerCase().indexOf("音频振幅") !== -1) {
audioAmplitudeLayer = layer; // 这是音频振幅层
} else {
audioLayer = layer; // 这是音频图层
}
}
// 确保音频图层和振幅图层都被选中
if (audioLayer == null || audioAmplitudeLayer == null) {
alert("请确保同时选中了音频图层和音频振幅图层!");
return;
}
// 获取音频振幅的滑块属性
var audioAmplitude = audioAmplitudeLayer.property("Effects").property("两个通道").property("滑块");
if (!audioAmplitude || audioAmplitude.numKeys === 0) {
alert("音频振幅层中没有找到关键帧!");
return;
}
var cutPoints = [];
var keepSections = [];
// 遍历所有振幅关键帧,找到小于阈值的振幅,记录其时间点
for (var j = 1; j <= audioAmplitude.numKeys; j++) {
var keyValue = audioAmplitude.keyValue(j);
var keyTime = audioAmplitude.keyTime(j);
// 记录需要保留的片段的起始点和结束点
if (keyValue >= silenceThreshold) {
if (keepSections.length === 0 || keepSections[keepSections.length - 1].end != null) {
keepSections.push({ start: keyTime, end: null });
}
} else if (keepSections.length > 0 && keepSections[keepSections.length - 1].end == null) {
keepSections[keepSections.length - 1].end = keyTime;
}
}
// 如果最后一个片段没有结束时间,设置为图层的 outPoint
if (keepSections.length > 0 && keepSections[keepSections.length - 1].end == null) {
keepSections[keepSections.length - 1].end = audioLayer.outPoint;
}
// 检查相邻气口之间的间隔是否小于 minInterval 秒
var finalSections = [];
for (var i = 0; i < keepSections.length; i++) {
var currentSection = keepSections[i];
if (i === 0 || currentSection.start - keepSections[i - 1].end > minInterval) {
finalSections.push(currentSection);
} else {
// 合并两个片段
finalSections[finalSections.length - 1].end = currentSection.end;
}
}
var newLayers = [];
// 根据最终保留的片段进行裁剪
for (var k = 0; k < finalSections.length; k++) {
var section = finalSections[k];
// 分割片段
if (section.start > audioLayer.inPoint && section.end < audioLayer.outPoint) {
// 复制图层,保留这个片段
var newLayer = audioLayer.duplicate();
newLayer.inPoint = section.start;
newLayer.outPoint = section.end;
newLayers.push(newLayer);
// 增加音频增益
var audioLevels = newLayer.property("Audio").property("Audio Levels");
audioLevels.setValue([gainValue, gainValue]);
}
}
// 删除原始图层
audioLayer.remove();
// 选中所有新生成的图层
for (var i = 0; i < newLayers.length; i++) {
newLayers[i].selected = true;
}
app.endUndoGroup();
}
// 显示UI
showUI();
运行截图:
但是现在还是有点麻烦,不知道有没有大佬解决一下【选中需要裁剪的图层右键-关键帧辅助-将音频转换为关键帧】这一步。
24.9.10更新V4.0,更新内容:
1、窗口可停靠在AE界面;
2、优化裁剪逻辑,在裁剪位置会往前往后加一帧,避免因为裁剪阈值导致的音频断掉;
3、裁剪完成后自动删除音频振幅;
4、裁剪后备份一份原音频(不可见且关闭声音);
5、裁剪后的图层进行重命名;
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|