83 lines
2.2 KiB
Markdown
83 lines
2.2 KiB
Markdown
|
|
# Documentation
|
|
- Class name: SaltAudioPitchShift
|
|
- Category: SALT/Audio/Effect
|
|
- Output node: False
|
|
|
|
该节点通过指定的半音数对输入音频应用音高偏移,从而实现音频操纵,可以调整声音的感知音高而不改变播放速度。
|
|
|
|
# Input types
|
|
## Required
|
|
- audio
|
|
- 待进行音高偏移的音频输入。它是进行音高偏移处理的主要内容。
|
|
- Comfy dtype: AUDIO
|
|
- Python dtype: bytes
|
|
- semitones
|
|
- 对输入音频进行音高偏移的半音数。正值会提高音高,负值则会降低音高。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
|
|
# Output types
|
|
- audio
|
|
- 应用音高偏移后的输出音频,其音高已按指定的半音数进行了调整。
|
|
- Comfy dtype: AUDIO
|
|
- Python dtype: bytes
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class SaltAudioPitchShift:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"audio": ("AUDIO", {}),
|
|
"semitones": ("FLOAT", {"default": 0.0, "min": -12.0, "max": 12.0}),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("AUDIO",)
|
|
RETURN_NAMES = ("audio",)
|
|
FUNCTION = "shift_pitch"
|
|
CATEGORY = "SALT/Audio/Effect"
|
|
|
|
def shift_pitch(cls, audio, semitones):
|
|
TEMP = tempfile.gettempdir()
|
|
os.makedirs(TEMP, exist_ok=True)
|
|
|
|
temp_input_path = tempfile.mktemp(suffix='.wav', dir=TEMP)
|
|
temp_output_path = tempfile.mktemp(suffix='.wav', dir=TEMP)
|
|
|
|
with open(temp_input_path, 'wb') as f:
|
|
f.write(audio)
|
|
|
|
command = [
|
|
'ffmpeg', '-y', '-i', temp_input_path,
|
|
'-af', f'asetrate=44100*2^({semitones}/12),aresample=44100',
|
|
temp_output_path
|
|
]
|
|
|
|
try:
|
|
subprocess.run(command, check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error during pitch shifting: {e}")
|
|
os.remove(temp_input_path)
|
|
if os.path.exists(temp_output_path):
|
|
os.remove(temp_output_path)
|
|
raise
|
|
|
|
with open(temp_output_path, 'rb') as f:
|
|
pitch_shifted_audio = f.read()
|
|
|
|
os.remove(temp_input_path)
|
|
os.remove(temp_output_path)
|
|
|
|
return (pitch_shifted_audio,)
|
|
|
|
```
|