Cách phát âm thanh tần số cố định bằng Python [đã đóng]


8

Tôi đã thử một số cách phát âm thanh tần số cố định (ví dụ 1000Hz) và không có gì hoạt động.

Tôi đã tải xuống "tiếng bíp" và điều đó không gây ra tiếng ồn.

Tôi đã thử giao tiếp với pyao, và điều đó không có kết quả.

Tôi đã thử can thiệp vào audiere và gặp lỗi thời gian chạy cho biết không thể tìm thấy thư viện, mặc dù đã cài đặt nó từ trung tâm phần mềm.

Bất kỳ hướng dẫn để cài đặt các thư viện thích hợp và mã có liên quan sẽ được đánh giá cao nhất.

Tôi không thể tạo tệp .mp3 / .wav cho việc này, nhưng cần tạo âm báo trong thời gian chạy.

Cám ơn bạn rất nhiều


Bạn cần phải làm cho WAVE nổi. Tại sao không gọi nó là FREQ? Ngoài ra phương trình không đúng. Hãy thử điều này: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128

Triển khai tốt hơn có thể được tìm thấy ở đây: stackoverflow.com/questions/974071/ từ
Gringo Suave

Câu trả lời:


10
import math
#sudo apt-get install python-pyaudio
from pyaudio import PyAudio

#See http://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000 #number of frames per second/frameset.      

#See http://www.phy.mtu.edu/~suits/notefreqs.html
FREQUENCY = 261.63 #Hz, waves per second, 261.63=C4-note.
LENGTH = 1.2232 #seconds to play sound

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

for x in xrange(NUMBEROFFRAMES):
   WAVEDATA += chr(int(math.sin(x / ((BITRATE / FREQUENCY) / math.pi)) * 127 + 128))    

#fill remainder of frameset with silence
for x in xrange(RESTFRAMES): 
    WAVEDATA += chr(128)

p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=1,
    rate=BITRATE,
    output=True,
    )
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

2
nó nên là(2*math.pi)
jfs

Tôi đã phải phân chia tương lai và 2 * math * pi để làm cho nó hoạt động chính xác. Python 2.8 32 bit
chwi

Python 2.7 phát âm thanh này dưới dạng âm thanh "mượt mà" trong khi Python 3.4 tạo ra âm thanh "ù" hơn nhiều. Tại sao? Tôi đã thử thêm phân chia ____future__, nhưng nó không có gì khác biệt.
Ubuntourist

@Ubuntourist Tôi không chắc, nhưng tôi nghĩ con trăn 2.7 của bạn sử dụng mã hóa 8 bit và Python 3,4 của bạn sử dụng UTF8, vì vậy việc char()sử dụng 2 Byte cho một số Giá trị trên Python 3.4 không phải là điều chúng tôi muốn ở đây.
12431234123412341234123

Nếu bạn sử dụng bytestrings thay vì charstrings của python3, bạn sẽ nhận được hiệu quả mong muốn
pizzapants184

4

Bạn có thể làm điều đó với python-pyaudio(có sẵn ít nhất trong 12.04):

from __future__ import division #Avoid division problems in Python 2
import math
import pyaudio
import sys

PyAudio = pyaudio.PyAudio
RATE = 16000
WAVE = 1000
data = ''.join([chr(int(math.sin(x/((RATE/WAVE)/math.pi))*127+128)) for x in xrange(RATE)])
p = PyAudio()

stream = p.open(format =
                p.get_format_from_width(1),
                channels = 1,
                rate = RATE,
                output = True)
for DISCARD in xrange(5):
    stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()

Cảm ơn sự giúp đỡ của bạn. Thật không may, tôi gặp vô số lỗi khi chạy và thực hiện bất kỳ thay đổi nào đối với RATE hoặc WAVE không có âm thanh. Các lỗi không được liệt kê do thiếu không gian nhưng tham khảo "ALSA lib". Làm cách nào để thay đổi a) để loại bỏ lỗi và b) thay đổi thời lượng và tần suất? Rất cám ơn,
user98415

Tôi cũng nhận được một loạt các thông báo lỗi, nhưng nó chơi tốt. Ngoài ra, thay đổi WAVE cho tôi cao độ khác nhau. Bạn đang sử dụng jack? Hay chỉ là pulseaudio?
taneli

2
@ user98415: thêm ở đầu from __future__ import divisionđể tránh cắt ngắn không cần thiết trên Python 2.
jfs

@JFSebastian Điều đó đã giải quyết mọi thứ cho tôi, cảm ơn bạn
chwi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.