【问题标题】:Python Sound SplicingPython 声音拼接
【发布时间】:2014-05-05 16:31:31
【问题描述】:

我正在开发一个程序,该程序接收音频文件,定位然后从文件中删除任何静音。此时程序运行,但是当我们播放返回的声音时,它只是原始文件的减慢版本。这个函数接受一个声音文件,然后是一个无声片段的开始和停止时间。然后该函数制作两个剪辑(一个剪辑之前的剪辑,一个静音之后的剪辑)并将这两个剪辑放在目标声音对象中。

    def spliceAudio(audio, start, stop):
      clipOneStart = 0
      clipOneEnd = start - 1
      clipTwoStart = stop + 1
      clipTwoEnd = getLength(audio) - 1 
      target = makeEmptySound(getLength(audio) - (stop-start)) 
      index = 0 
      for source in range(clipOneStart, clipOneEnd): 
         value = getSampleValueAt(audio, source) 
         setSampleValueAt(target, index, value)
         index = index + 1 
      for source in range(clipTwoStart, clipTwoEnd):
         value - getSampleValueAt(audio, source)
         setSampleValueAt(target, index, value)
         index = index + 1 
      play(target)
      return target

对我来说,一切看起来都应该正常工作,但并没有给我们预期的结果。有什么想法吗?

【问题讨论】:

  • value - getSampleValueAt(audio, source)。那个连字符是错字吗?
  • 哎呀,是的。不过,修复并没有改变目标声音对象。
  • Idk 如果这有帮助,但 iirc Echo Nest API 应该有用;也检查一下forever.fm。开发人员在他的博客上详细讨论了他如何处理大量切割、分割和拼接。

标签: python audio jython splice


【解决方案1】:

您的代码逻辑看起来不错。音频播放速度的常见问题涉及您分配给音频数据的参数,具体而言:

  • 采样频率
  • 频道数
  • 位深度(可能不相关,因为看起来数据存储在数组中)

我没有任何使用 jython 的经验,但是在您调用 makeEmptySound() 函数时,您的代码中没有任何内容表明正在为 target 设置任何这些参数。我想它们会有默认值,但值得检查它们是什么以及它们是否与您的输入数据匹配。

【讨论】:

  • 好的,所以我将目标变量更新为: target = makeEmptySound(getLength(audio) - (stop-start), int(getSamplingRate(audio))) 现在它以正常速度播放,但没有'似乎没有削减任何东西。
  • @user3386133 - 在这种情况下,我只能建议您尝试通过以下任一(或组合)来诊断问题:在初始化之后和两个循环之间播放target;在循环中打印出valuegetSampleValueAt(target, index) 以检查它是否被提取并正确设置。
  • 可能还值得一提的是,如果startstop 非常接近,那么您可能不会注意到它会删除任何内容,因为音频的常见采样频率是 44100Hz。即使是 0.05s 的非常小的时间步长也是 2000 个左右的样本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多