Hướng dẫn python-sounddevice stream - luồng dịch vụ âm thanh python

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:

#!/usr/bin/env python3
import sounddevice as sd

fs = 16000

while True:
    print('Started listening')
    myrecording = sd.rec(int(4 * fs), dtype='int16', channels=1, blocking=True)

Tuy nhiên, thay vì có một đoạn 4 giây cố định, tôi muốn

sd.default.samplerate = fs
2 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 = fs
4, đ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 = fs
2?

Đầu tiên, nhập mô -đun:

Phát lại

Giả sử bạn có một mảng Numpy có tên

sd.default.samplerate = fs
6 giữ dữ liệu âm thanh với tần số lấy mẫu là
sd.default.samplerate = fs
7 (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 = fs
8:

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 = fs
9:

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 = fs
6, 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 = fs
6 (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 = 2
0 để 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 = 2
1 hoặc bằng cách chuyển nó làm đối số thiết bị cho
sd.default.samplerate = fs
8,
sd.default.samplerate = fs
sd.default.channels = 2
3, 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 = 2
1 để 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ại

Callback Dây dây với

sd.default.samplerate = fs
sd.default.channels = 2
5:

sd.default.samplerate = fs
0

Điều tương tự với

sd.default.samplerate = fs
sd.default.channels = 2
6:

sd.default.samplerate = fs
1

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ể).