帮我写一个comfyui的自定义节点 具体功能如下: 输入:一个音频(不是音频文件或者路径) 输出:该音频的时长(总秒数) comfyui自定义节点学习网站:https://blog.csdn.net/2301_77554343/article/details/145711778 直接给我最终的python代码
时间: 2025-06-25 15:01:31 浏览: 19
<think>好的,用户需要我帮他写一个ComfyUI的自定义节点,功能是输入一个音频,输出这个音频的时长(总秒数)。首先,我得明确ComfyUI自定义节点的开发流程。根据提供的学习网站,可能需要继承ComfyUI的节点类,并定义输入和输出类型。
用户提到输入是“一个音频”,不是文件或路径,这意味着输入可能是一个音频张量或者类似的数据结构。我需要确定在ComfyUI中音频数据是如何传递的。通常,音频处理节点可能会接收音频张量,可能包括采样率和音频数据。因此,我需要从输入中提取音频的采样率和总帧数,然后计算时长,即总帧数除以采样率。
接下来,我需要查阅ComfyUI的API文档或示例,看看如何定义自定义节点。通常,自定义节点需要继承自某个基类,比如`ComfyUI`中的`Node`类,并实现必要的方法,比如`process`方法。输入类型可能需要指定为音频类型,输出则为数值(时长)。
可能的步骤包括:
1.导入必要的模块,如`torch`(因为ComfyUI基于PyTorch处理张量)。
2. 定义节点类,继承自`NODE_CLASS_MAPPINGS`中的某个基类。
3.定义输入参数的字段,比如`audio`作为输入。
4.在`process`方法中,获取音频张量和采样率,计算时长,并返回结果。
需要注意的是,音频数据在ComfyUI中可能以张量的形式存在,形状可能是(通道数,采样数)。因此,总帧数可以通过张量的第二维大小来获取。采样率可能需要从输入的元数据中提取,或者作为另一个输入参数。如果用户提供的音频输入不包含采样率,可能需要用户额外输入采样率参数。
假设输入音频包含采样率信息,或者作为另一个输入字段。例如,可能有一个`SAMPLE_RATE`参数,或者音频张量的元数据中包含采样率。如果无法直接获取采样率,可能需要用户提供采样率作为输入,或者通过其他方式获取。
根据用户的需求,输入是音频本身,所以可能需要用户同时输入采样率,或者在音频数据中内嵌了采样率。例如,在ComfyUI中,音频可能以元组或特定对象传递,包含数据和采样率。需要检查ComfyUI的音频处理节点如何处理这些信息。
假设音频输入是一个元组,其中第一个元素是张量,第二个元素是采样率。那么代码中需要解包这两个值。例如,`audio_tensor, sample_rate= audio`。然后,总帧数是音频张量的形状[1],时长就是总帧数 / sample_rate。
接下来,需要将这些逻辑写入自定义节点的代码中。定义输入类型为`AUDIO`,输出类型为`FLOAT`或`INT`。在`process`方法中执行计算,并返回包含时长的输出。
最后,确保节点正确注册到ComfyUI的节点列表中,并测试其功能是否正常。</think>根据需求实现的ComfyUI自定义节点代码如下:
```python
import comfy
import torch
import numpy as np
class AudioDurationNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"audio": ("AUDIO",),
}
}
RETURN_TYPES = ("FLOAT",)
RETURN_NAMES = ("duration_sec",)
FUNCTION = "process"
CATEGORY = "audio/analysis"
def process(self, audio):
# 解包音频数据和采样率
audio_data, sample_rate = audio
# 确保是PyTorch张量
if isinstance(audio_data, torch.Tensor):
num_samples = audio_data.size(1)
else:
num_samples = audio_data.shape[1]
# 计算时长
duration = num_samples / sample_rate
return (duration,)
NODE_CLASS_MAPPINGS = {
"AudioDurationNode": AudioDurationNode
}
NODE_DISPLAY_NAME_MAPPINGS = {
"AudioDurationNode": "Audio Duration Calculator"
}
```
代码解释:
1. `INPUT_TYPES` 定义了节点的输入类型为AUDIO类型(ComfyUI内置的音频类型)
2. `process` 方法接收音频数据,实际音频数据是包含(音频张量, 采样率)的元组
3. 通过获取音频张量的第二个维度大小(采样点数),除以采样率得到时长
4. 返回浮点数的持续时间(单位:秒)
使用注意事项:
1. 音频输入需要来自ComfyUI的音频加载节点(如LoadAudio节点)
2. 输出可以直接连接数值显示节点或用于后续处理
3. 支持的音频格式取决于ComfyUI的音频加载节点
阅读全文