วิธีเล่นเสียงความถี่คงที่โดยใช้ Python [ปิด]


8

ฉันลองเล่นหลายวิธีในการเล่นเสียงความถี่คงที่ (เช่น 1000Hz) และไม่มีอะไรทำงาน

ฉันดาวน์โหลด "บี๊บ" แล้วและก็ไม่มีเสียงดัง

ฉันพยายามเชื่อมต่อกับ pyao และนั่นไม่มีผลกระทบ

ฉันพยายามเชื่อมต่อกับเครื่องส่งสัญญาณเสียงและได้รับข้อผิดพลาดรันไทม์ที่ระบุว่าไม่พบไลบรารีแม้จะติดตั้งจากศูนย์ซอฟต์แวร์

คำแนะนำสำหรับการติดตั้งไลบรารีที่เหมาะสมและรหัสที่เกี่ยวข้องจะได้รับการชื่นชมมากที่สุด

ฉันไม่สามารถสร้างไฟล์. mp3 / .wav สำหรับสิ่งนี้ แต่จำเป็นต้องสร้างเสียงในขณะใช้งาน

ขอบคุณมากสำหรับคุณ


คุณต้องทำให้คลื่นลอย ทำไมไม่เรียกว่า FREQ สมการไม่ถูกต้อง ลองสิ่งนี้: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128

การใช้งานที่ดีขึ้นสามารถพบได้ที่นี่: stackoverflow.com/questions/974071/…
Gringo Suave

คำตอบ:


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
ควรจะเป็น(2*math.pi)
jfs

ฉันต้องมีการหารในอนาคตและ 2 * math * pi เพื่อให้ทำงานได้อย่างถูกต้อง Python 2.8 32 บิต
chwi

Python 2.7 เล่นสิ่งนี้เป็นเสียง "ราบรื่น" ในขณะที่ Python 3.4 ให้เสียง "buzzier" มาก ทำไม? ฉันพยายามเพิ่มหมวด ____ อนาคต แต่ก็ไม่ได้สร้างความแตกต่าง
Ubuntourist

@ Unbuntourist ฉันไม่แน่ใจ แต่ฉันคิดว่า python 2.7 ของคุณใช้การเข้ารหัส 8 บิตและ Python 3.4 ของคุณใช้ UTF8 ดังนั้นการchar()ใช้ 2 ไบต์สำหรับค่าบางอย่างบน Python 3.4 ซึ่งไม่ใช่สิ่งที่เราต้องการที่นี่
12431234123412341234123

หากคุณใช้ bytestrings แทนการใช้บทสนทนาของ python3 คุณควรได้รับผลที่ต้องการ
pizzapants184

4

คุณสามารถทำได้ด้วยpython-pyaudio(มีอย่างน้อย 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()

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. น่าเสียดายที่ฉันได้รับข้อผิดพลาดจำนวนมากเมื่อทำงานและทำการเปลี่ยนแปลงใด ๆ กับ RATE หรือ WAVE ทำให้ไม่มีเสียง ข้อผิดพลาดไม่ได้อยู่ในรายการเนื่องจากพื้นที่ไม่เพียงพอ แต่อ้างถึง "ALSA lib" ฉันจะเปลี่ยน a) เพื่อกำจัดข้อผิดพลาดและ b) เพื่อเปลี่ยนระยะเวลาและความถี่ได้อย่างไร ขอบคุณมาก
user98415

ฉันยังได้รับข้อความแสดงข้อผิดพลาดจำนวนมาก แต่มันก็ใช้ได้ดี นอกจากนี้การเปลี่ยน WAVE ก็ให้ระดับเสียงที่แตกต่างกัน คุณกำลังใช้แจ็ค หรือเพียงแค่ pulseaudio
taneli

2
@ user98415: เพิ่มที่ด้านบนfrom __future__ import divisionเพื่อหลีกเลี่ยงการตัดทอนโดยไม่จำเป็นบน Python 2
jfs

@JFSebastian นั่นแก้ไขทุกอย่างให้ฉันขอบคุณ
chwi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.