Cara memainkan suara frekuensi tetap menggunakan Python [tertutup]

8

Saya telah mencoba sejumlah cara memainkan suara frekuensi tetap (misalnya 1000Hz) dan tidak ada yang berhasil.

Saya telah mengunduh "bip" dan itu tidak menimbulkan suara.

Saya mencoba menghubungkan ke pyao, dan itu tidak berpengaruh.

Saya mencoba berinteraksi dengan audiere, dan mendapatkan kesalahan runtime yang menunjukkan perpustakaan tidak dapat ditemukan, meskipun menginstalnya dari pusat perangkat lunak.

Setiap panduan untuk pemasangan perpustakaan yang sesuai dan kode yang relevan akan sangat dihargai.

Saya tidak dapat menghasilkan file .mp3 / .wav untuk ini, tetapi harus menghasilkan nada pada saat dijalankan.

Terima kasih banyak untukmu

pengguna98415
sumber
Anda perlu membuat WAVE pelampung. Mengapa tidak menyebutnya FREQ? Persamaannya juga tidak benar. Coba ini: math.sin ((x * 2 * math.pi * FREQ) / RATE) * 127) +128
Implementasi yang lebih baik dapat ditemukan di sini: stackoverflow.com/questions/974071/…
Gringo Suave

Jawaban:

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()
pengguna274527
sumber
2
seharusnya(2*math.pi)
jfs
Saya harus memiliki divisi masa depan dan 2 * matematika * pi untuk membuatnya bekerja dengan benar. Python 2.8 32 bit
chwi
Python 2.7 memainkan ini sebagai suara "halus" sedangkan Python 3.4 menghasilkan suara yang "lebih ramai". Mengapa? Saya mencoba menambahkan divisi ____future____, tetapi tidak ada bedanya.
Ubuntourist
@Ubuntourist Saya tidak yakin, tetapi saya pikir python 2.7 Anda menggunakan pengkodean 8-Bit dan Python 3.4 Anda menggunakan UTF8, jadi char()gunakan 2 Bytes untuk beberapa Nilai pada Python 3.4 yang bukan yang kita inginkan di sini.
12431234123412341234123
Jika Anda menggunakan bytestrings alih-alih charthon python3, Anda harus mendapatkan efek yang diinginkan
pizzapants184
4

Anda dapat melakukannya dengan python-pyaudio(tersedia setidaknya dalam 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()
taneli
sumber
Terima kasih untuk bantuannya. Sayangnya, saya mendapatkan banyak kesalahan saat menjalankan, dan membuat perubahan apa pun pada RATE atau WAVE menghasilkan suara. Kesalahan tidak terdaftar karena kurangnya ruang tetapi merujuk ke "ALSA lib". Bagaimana saya mengubah a) untuk menghilangkan kesalahan dan b) untuk mengubah durasi dan frekuensi? Terima kasih banyak,
user98415
Saya juga mendapatkan banyak pesan kesalahan, tetapi tidak masalah. Juga, mengubah WAVE memberi saya nada yang berbeda. Apakah Anda menggunakan jack? Atau hanya pulseaudio?
taneli
2
@ user98415: tambahkan di bagian atas from __future__ import divisionuntuk menghindari pemotongan yang tidak perlu pada Python 2.
jfs
@JFSebastian Itu menyelesaikan segalanya untuk saya, terima kasih
chwi