convert_abc.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. '''
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2025/03/18 13:45:29
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc :
  8. 批量把音频转换为abc乐谱格式
  9. pip install pydub music21
  10. apt-get update
  11. apt-get install ffmpeg
  12. '''
  13. import os
  14. from pydub import AudioSegment
  15. from music21 import *
  16. def audio_to_score(audio_file_path):
  17. try:
  18. # 读取音频文件
  19. audio = AudioSegment.from_file(audio_file_path)
  20. # 这里可以添加更复杂的音频特征提取逻辑,例如音高检测等
  21. # 为了简化示例,我们假设已经提取到了音高和节奏信息
  22. # 这里简单创建一个简单的音符序列
  23. s = stream.Stream()
  24. # 添加一个 C4 音符,持续时间为 1 拍
  25. n = note.Note('C4', quarterLength=1)
  26. s.append(n)
  27. return s
  28. except Exception as e:
  29. print(f"音频转换为乐谱时出现错误: {e}")
  30. return None
  31. def batch_audio_to_score(input_folder, output_folder):
  32. # 确保输出文件夹存在
  33. os.makedirs(output_folder, exist_ok=True)
  34. # 遍历输入文件夹中的所有文件
  35. for root, dirs, files in os.walk(input_folder):
  36. for file in files:
  37. if file.endswith(('.mp3', '.wav', '.ogg')):
  38. audio_file_path = os.path.join(root, file)
  39. score = audio_to_score(audio_file_path)
  40. if score:
  41. # 生成输出文件路径
  42. output_file_name = os.path.splitext(file)[0] + '.midi'
  43. output_file_path = os.path.join(output_folder, output_file_name)
  44. # 保存乐谱
  45. score.write('midi', fp=output_file_path)
  46. print(f"已将 {audio_file_path} 转换为 {output_file_path}")
  47. if __name__ == "__main__":
  48. input_folder = 'your_input_audio_folder'
  49. output_folder = 'your_output_score_folder'
  50. batch_audio_to_score(input_folder, output_folder)