Tôi hiện có một số mã Python liên tục ghi lại các khối âm thanh 4 giây:
Tuy nhiên, thay vì có một đoạn 4 giây cố định, tôi muốn sd.default.samplerate = fs2 ghi lại cho đến khi âm lượng của các giọt dưới ngưỡng âm thanh (tức là, khi người có micrô đã ngừng nói), và sau đó bắt đầu nghe lại. Về cơ bản, tôi muốn bắt chước hành vi của một lệnh như ____ 13 của sd.default.samplerate = fs4, điều này chính xác là điều này. Có một cách dễ dàng để làm điều này với sd.default.samplerate = fs2? Đầu tiên, nhập mô -đun: Phát lạiGiả sử bạn có một mảng Numpy có tên sd.default.samplerate = fs6 giữ dữ liệu âm thanh với tần số lấy mẫu là sd.default.samplerate = fs7 (trong hầu hết các trường hợp, đây sẽ là 44100 hoặc 48000 khung hình mỗi giây), bạn có thể phát lại với sd.default.samplerate = fs8: Hàm này trả về ngay lập tức nhưng tiếp tục chơi tín hiệu âm thanh trong nền. Bạn có thể ngừng phát lại với sd.default.samplerate = fs9: Nếu bạn biết rằng bạn sẽ sử dụng cùng một tần số lấy mẫu trong một thời gian, bạn có thể đặt nó làm mặc định bằng cách sử dụng duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)0: sd.default.samplerate = fs Sau đó, bạn có thể bỏ đối số lấy mẫu: Ghi âm¶Để ghi lại dữ liệu âm thanh từ thiết bị âm thanh của bạn vào một mảng numpy, hãy sử dụng duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)1: duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2) Một lần nữa, để sử dụng lặp lại, bạn có thể đặt mặc định bằng duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)2: sd.default.samplerate = fs sd.default.channels = 2 Sau đó, bạn có thể bỏ các đối số bổ sung: myrecording = sd.rec(int(duration * fs)) Hàm này cũng trả về ngay lập tức nhưng tiếp tục ghi trong nền. Trong thời gian chờ đợi, bạn có thể chạy các lệnh khác. Nếu bạn muốn kiểm tra xem bản ghi đã kết thúc, bạn nên sử dụng duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)3: Nếu bản ghi đã kết thúc, điều này sẽ trả lại ngay lập tức; Nếu không, nó chờ đợi và trả lại ngay khi bản ghi kết thúc. Ngoài ra, bạn có thể đã sử dụng đối số chặn ngay từ đầu: myrecording = sd.rec(duration * fs, blocking=True) Theo mặc định, mảng được ghi lại có kiểu dữ liệu duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)4 (xem duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)5), nhưng điều này có thể được thay đổi với đối số DTYPE: myrecording = sd.rec(duration * fs, dtype='float64') Phát lại và ghi âm đồng thờiĐể phát lại một mảng và ghi lại cùng một lúc, hãy sử dụng duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)6: myrecording = sd.playrec(myarray, fs, channels=2) Số lượng kênh đầu ra được lấy từ sd.default.samplerate = fs6, nhưng số lượng kênh đầu vào vẫn phải được chỉ định. Một lần nữa, các giá trị mặc định có thể được sử dụng: sd.default.samplerate = fs sd.default.channels = 2 myrecording = sd.playrec(myarray) Trong trường hợp này, số lượng kênh đầu ra vẫn được lấy từ sd.default.samplerate = fs6 (có thể hoặc không có 2 kênh), nhưng số lượng kênh đầu vào được lấy từ duration = 10.5 # seconds myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)9. Lựa chọn thiết bịTrong nhiều trường hợp, (các) thiết bị đầu vào/đầu ra mặc định sẽ là một (các) thiết bị bạn muốn, nhưng tất nhiên có thể chọn một thiết bị khác. Sử dụng sd.default.samplerate = fs sd.default.channels = 20 để có được danh sách các thiết bị được hỗ trợ. Danh sách tương tự có thể được lấy từ một thiết bị đầu cuối bằng cách nhập lệnh Bạn có thể sử dụng ID thiết bị tương ứng để chọn một thiết bị mong muốn bằng cách gán cho sd.default.samplerate = fs sd.default.channels = 21 hoặc bằng cách chuyển nó làm đối số thiết bị cho sd.default.samplerate = fs8, sd.default.samplerate = fs sd.default.channels = 23, v.v. Thay vì ID thiết bị số, bạn cũng có thể sử dụng danh sách phân tách không gian của các chuỗi con không nhạy cảm của tên thiết bị (và tên API máy chủ, nếu cần). Xem sd.default.samplerate = fs sd.default.channels = 21 để biết chi tiết. import sounddevice as sd sd.default.samplerate = 44100 sd.default.device = 'digital output' sd.play(myarray) Các luồng gọi lạiCallback Dây dây với sd.default.samplerate = fs sd.default.channels = 25: sd.default.samplerate = fs0 Điều tương tự với sd.default.samplerate = fs sd.default.channels = 26: sd.default.samplerate = fs1 Ghi chú Chúng tôi đang sử dụng các mẫu 24 bit ở đây mà không có lý do cụ thể (chỉ vì chúng tôi có thể). |