Python을 사용하여 고정 주파수 사운드를 재생하는 방법 [닫기]


8

고정 주파수 사운드 (예 : 1000Hz)를 재생하는 여러 가지 방법을 시도했지만 아무 효과가 없습니다.

"경고음"을 다운로드했는데 소리가 나지 않습니다.

나는 pyao와의 인터페이스를 시도했지만 아무런 효과가 없었습니다.

audiere와 인터페이스를 시도했지만 소프트웨어 센터에서 라이브러리를 설치했지만 라이브러리를 찾을 수 없다는 런타임 오류가 발생했습니다.

적절한 라이브러리 및 관련 코드 설치에 대한 모든 지침을 가장 잘 알고 있습니다.

이를 위해 .mp3 / .wav 파일을 생성 할 수 없지만 런타임시 톤을 생성해야합니다.

많은 감사합니다


WAVE를 플로트로 만들어야합니다. 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 * 수학이 제대로 작동하도록 * 파이. Python 2.8 32 비트
chwi

파이썬 2.7은 이것을 "부드러운"사운드로 재생하는 반면, 파이썬 3.4는 훨씬 "부지런한"사운드를 생성합니다. 왜? ____future____ 부서를 추가하려고 시도했지만 아무런 차이가 없었습니다.
Ubuntourist

@ Ubuntourist 확실하지 않지만 Python 2.7은 8 비트 인코딩을 사용하고 Python 3.4는 UTF8을 사용하므로 char()Python 3.4의 일부 값에 2 바이트를 사용 하면 여기에서 원하는 것이 아닙니다.
12431234123412341234123

대신 python3의 charstrings의 bytestrings를 사용하는 경우가 원하는 기능을한다
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) 지속 시간과 빈도를 변경하려면 어떻게합니까? 많은 감사의
말씀

또한 많은 오류 메시지가 표시되지만 잘 재생됩니다. 또한 WAVE를 변경하면 피치가 다릅니다. 잭을 사용하고 있습니까? 아니면 그냥 펄스 오디오?
taneli

2
@ user98415 : from __future__ import division파이썬 2에서 불필요한 절단을 피하기 위해 맨 위에 추가하십시오 .
jfs

@JFSebastian 저를 위해 모든 것을 해결했습니다. 감사합니다
chwi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.