現在、私はPythonだけを使ってwaveファイルに関するいくつかの小さな研究を行っています。 私が今解決できない1つの問題は、wavデータを分割することです。 24ビットの音の深さで正しくフォーマットすることができます。splititng純粋なpythonの間隔で24ビット深さのWAVサウンド
したがって、基本的な考えはt1
- startとt2
-endを指定しており、私はslice
を取得する必要がありますが、これはかなり明確です。
def split_in_interval(self, start, end):
start *= ONE_SEC_MS
end *= ONE_SEC_MS
header = self.wav_header.header_description
infile = open(self.file_name, 'rb')
rate = header['sample_rate']
frames_per_m_sec = rate // 1000
length = (end - start) * frames_per_m_sec
start_ms = start * frames_per_m_sec
name_str = self._naming_fragment(start, end)
out_file = open(name_str, 'wb')
# as the size changes - need to recalculate only last part of header,
# it takes 4 last bytes of header
out_file.write(infile.read(WAV_HEADER - 4))
size = length * header['block_align']
# header['num_channels'] * width
packed_size = struct.pack('<L', size)
out_file.write(packed_size)
anchor = infile.tell()
infile.seek(anchor + start_ms)
out_file.write(infile.read(size))
out_file.close()
infile.close()
私のコードはかなり単純ですが、16ビットと8ビットの深度の音でうまく動作すると思いますが、24回試してみると失敗します。
私はレートをとり、ミリ秒に変換します。私の開始パラメータと終了パラメータもmsに変換されます。 そして、この計算に基づいて、彼らが正しいと仮定して、ソースオーディオにstart_pointを見つけて、この点から最後まで書きます。 どうすればいいですか? この問題を解決するには、のみ外部ライブラリのないPython。
ありがとうございます。
これはあなたの問題に直接関係しているのかどうかは分かりませんが、 'frames_per_m_sec = rate // 1000'は整数の除算のために問題があります。サンプルレートが例えば44.1kHzで、これは珍しくない場合、 'frames_per_m_sec = 44'となり、フレームオフセットへの時間の変換は数パーセントだけオフになります。 – wildwilhelm
24ビットファイルでコードがどのように「失敗」するのかを具体的に記述できますか?あなたの問題はどのように現れますか? – wildwilhelm
精度についてのあなたの注意は、絶対にノーサイズのサウンドには役立つかもしれないと思うが、私は16ビットのコンポジションでそれをすべてうまく使っている。ただし、24ビットの試行では、結果ファイルにノイズがなく、元のサウンドが得られません – Lescott