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


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()

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()

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.