Hướng dẫn bytes to wav python - byte cho wav python

Tôi phải đối mặt với cùng một vấn đề trong khi phát trực tuyến và tôi đã sử dụng các câu trả lời ở trên để viết một chức năng hoàn chỉnh. Trong trường hợp của tôi, mảng byte đến từ việc phát trực tuyến một tệp âm thanh (frontend) và phần phụ trợ cần xử lý nó như một ndarray.

Chức năng này mô phỏng cách các kết thúc mặt trước gửi tệp âm thanh dưới dạng các khối được tích lũy vào mảng byte:

audio_file_path = 'offline_input/zoom283.wav'

chunk = 1024

wf = wave.open(audio_file_path, 'rb')
audio_input = b''
d = wf.readframes(chunk)
while len(d) > 0:
    d = wf.readframes(chunk)
    audio_input = audio_input + d

Một số thư viện nhập khẩu:

import io
import wave

import numpy as np
import scipy.io.wavfile
import soundfile as sf
from scipy.io.wavfile import write

Cuối cùng, phụ trợ sẽ lấy một mảng byte và chuyển đổi nó thành ndarray:

def convert_bytearray_to_wav_ndarray(input_bytearray: bytes, sampling_rate=16000):
    bytes_wav = bytes()
    byte_io = io.BytesIO(bytes_wav)
    write(byte_io, sampling_rate, np.frombuffer(input_bytearray, dtype=np.int16))
    output_wav = byte_io.read()
    output, samplerate = sf.read(io.BytesIO(output_wav))
    return output


output = convert_bytearray_to_wav_ndarray(input_bytearray=audio_input)

Đầu ra đại diện cho tệp âm thanh được xử lý bởi phần phụ trợ:

Để kiểm tra xem tệp đã được nhận chính xác chưa, chúng tôi viết nó vào bàn:

scipy.io.wavfile.write("output1.wav", 16000, output)

Tệp python để chuyển đổi tệp wav thành các byte thô trong tệp DOT H cho DAC trên hạt photon

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

#-*-Mã hóa: UTF-8-*-
# Lưu ý: Tệp WAV phải là định dạng 16bit-PCM.
# Nó phải được mã hóa ở 22050Hz.
# Chỉ các tệp âm thanh Mono được hỗ trợ tại thời điểm này.
# Các bước để tạo tệp trong Audacity:
# 1) Mở tệp WAV trong Audacity.
# 2) Nếu đó là âm thanh nổi, hãy chia âm thanh nổi thành Mono
# 3) Xóa một trong các kênh
# 4) Đặt tỷ lệ dự án thành 22050Hz
# 5) Đặt định dạng mẫu thành PCM 16 bit
# 6) Xuất tệp, để lại tất cả các trường dữ liệu meta tệp
#
# Chạy tập lệnh bên dưới, cập nhật đường dẫn tệp vào tệp bạn vừa xuất.
# Tệp văn bản được tạo chứa nội dung byte được điều chỉnh cho
# DAC trên hạt photon
Nhập khẩu wave
ClassSoundFile: SoundFile:
def__init __ (tự, tên tệp): __init__(self, filename):
self.filename=filename.filename = filename
self.file = wave.open (tên tệp, 'rb')).file = wave.open(filename, 'rb')
self.framecount = self.file.getnframes ().frameCount = self.file.getnframes()
độ lệch (tự): describe(self):
return tự.file.getparams () self.file.getparams()
DEFCLOSE (tự): close(self):
return tự.file.close () self.file.close()
# Trả về một mảng từ 16 bit
# Tham gia byte của mảng khung
defbytearray (tự): byteArray(self):
curFrame=0 = 0
FRAMEARRAY = [] = []
Khung whilecurframe curFrame < self.frameCount:
frame = self.file.ReadFrames (1) = self.file.readframes(1)
# Giả sử khung 16 bit
b1 = frame [0] #right bit = frame[0] #right bit
B2 = khung [1] #left bit = frame[1] #left bit
B = (B2 = (b2 << 8) + b1
#Print ('{0: 08b} {1: 08b} -> {2: 016b}'. Định dạng (B2, B1, B))
Framearray.append (b).append(b)
curFrame+=1 += 1
ReturnFramearray frameArray
DefbyteformadedString (self, Barray): byteFormatedString(self, bArray):
Bstrings = = []
Foridx, Vallinenumerate (Barray): idx, val in enumerate(bArray):
hexStr='' = ''
If ((idx%30 = 0) và (idx> 0): ((idx % 30 == 0) and (idx > 0)):
Hexstr+= '\ n' \ n '\ n += '\n'
Hexstr+= ('0x {: 04x}'. Form (val)) += ('0x{:04x}'.format(val))
Bstrings.appd (Hixstr).append(hexStr)
Trả lại ",". Tham gia (BSTRINGS) ",".join(bStrings)
# Chuyển đổi lời khen của Wave Two để đăng
# Số nguyên và thay đổi số nguyên dương hiện có lên
Tháng 6 năm 2017 (tự, Barray) twosToOnes(self, bArray):
OnesArray = = []
ForpeopleBarray: b in bArray:
Ifb> 0x8000: b > 0x8000:
B2 = 0x8000- (0xffffff & (~ b+1))) = 0x8000 - (0xffff & (~b + 1))
#Print ('{0: 016b} nn {1: 016b}'. Định dạng (b, b2))
Khác::
b2=b+0x8000 = b + 0x8000
#Print ('{0: 016b} pp {1: 016b}'. Định dạng (b, b2))
#Print ('{0} -> {1}'. Mẫu (b, b2))
OnesArray.Append (B2).append(b2)
Return (OnesArray)(onesArray)
DEFTODAC12 (Tự, Barray): toDAC12(self, bArray):
Dacarray = = []
ForpeopleBarray: b in bArray:
dacVal=b>>4 = b >> 4
#print('0x{:04x}'.format(dacVal))
Ifb> 0x8000:
B2 = 0x8000- (0xffffff & (~ b+1))) dacVal > 4095:
#Print ('{0: 016b} nn {1: 016b}'. Định dạng (b, b2))('ALERT - Out of band')
Khác:.append(b>>4)
#Print ('{0: 016b} pp {1: 016b}'. Định dạng (b, b2)) dacArray
#Print ('{0} -> {1}'. Mẫu (b, b2)) writeFile(self):
OnesArray.Append (B2) = self.filename.replace('.wav', '.h')
Return (OnesArray) = open(txtName, 'w')
DEFTODAC12 (Tự, Barray):.truncate()
Dacarray =.write('\n\n// Auto generated\nint frame_count = {};\n'.format(self.frameCount))
#Print (Dacval).write('const uint16_t wave_data[{}] =\n'.format(self.frameCount))
IFDACVAL> 4095:.write('{')
In ('ALERT - OUT OFF BAND') = self.byteArray()
Dacarray.append (b >> 4) = self.twosToOnes(bArray)
ReturnDacarray = self.toDAC12(bArray)
Defwritefile (tự):.write(self.byteFormatedString(bArray))
txtname = self.filename.replace ('. wav', '.h')).write('};\n')
txt = open (txtname, 'w').close()
txt.truncate () main():
fpath='BB8_shake.wav' = 'BB8_shake.wav'
txt.write ('\ n \ n // tự động tạo \ nint frame_count = {}; \ n'.form (self.framecount)) = SoundFile(fpath)
txt.write ('const uint16_t wave_data [{}] = \ n'.format (self.framecount)) = wav.describe()
txt.write ('{' {'{')(wavProps)
Barray = self.ByteArray ()('writing file')
Barray = self.twostones (Barray).writeFile()
Barray = self.Todac12 (Barray)('done')
txt.write (self.byteformadedString (Barray)()