2016-09-10 6 views
0

Я генерироваться последовательность частот звука из текстового файла с помощью:Генерация звуковой волны из текстового файла

import mmap 
import math 
import pyaudio 

fh = open('/home/jay/Documents/try.txt', 'rb') 

m = mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ) 
ba = bytearray(m) 

#sudo apt-get install python-pyaudio 
PyAudio = pyaudio.PyAudio 

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

for freq in ba: 
#See http://www.phy.mtu.edu/~suits/notefreqs.html 
    FREQUENCY = 300 + freq #Hz, waves per second, 261.63=C4-note. 
    LENGTH = 1 #seconds to play sound 

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

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

    #fill remainder of frameset with silence 
    for x in xrange(RESTFRAMES): 
    WAVEDATA = 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() 

(try.txt может быть любой текстовый файл, который вы хотите)

Но его имея некоторый шум в между частотой как я могу удалить его и сохранить последовательность всех frequncy, играемых в .wave или .mp3-файле? Извините, я все еще учился, поэтому, если я не понимаю, спрашиваю. Thanks, Jay

+0

Я ничего подозрительного (я использовал Python 3 и адаптировать свой код) не слышал. Можете ли вы поделиться с ним txt-файлом? (было бы лучше с жестко запрограммированным списком для этого почти [mcve]) –

+0

Привет, я использовал python2.7 и pyaudio. для текстового файла я просто скопировал один и тот же код. Благодарю. –

+0

То же самое, что и что? Ваш вопрос должен быть автономным. –

ответ

0

Самая большая проблема здесь в том, что вы открываете/закрываете аудиопоток на каждой частоте.

Вместо этого сохраните поток открытым, и вы получите намного меньше «кликов». Это не означает, что вы не получите кликов, возможно, потому, что время обработки иногда слишком велико, и поток прерывается. Лучшим способом было бы многопоточное поколение и писать, чтобы быть более реактивным, но это еще одна история ...

Я также добавил .wav сохранить емкость. Мои имена файлов. Работает очень хорошо.

Исправлен код (работает с Python 3)

import mmap 
import math 
import pyaudio,wave 
import array 


fh = open('K:\out.txt', 'rb') 

m = mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ) 
ba = bytearray(m) 

#ba = [300,400,500,400,200] 
#sudo apt-get install python-pyaudio 
PyAudio = pyaudio.PyAudio 

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

p = PyAudio() 
stream = p.open(format = p.get_format_from_width(1), 
       channels = 1, 
       rate = BITRATE, 
       output = True) 

wf=wave.open("K:\wavout.wav","wb") 
wf.setnchannels(1) 
wf.setsampwidth(p.get_sample_size(pyaudio.paInt8)) # byte = 8 bits else trashed 
wf.setframerate(BITRATE) 


for freq in ba: 
#See http://www.phy.mtu.edu/~suits/notefreqs.html 
    FREQUENCY = 300 + freq #Hz, waves per second, 261.63=C4-note. 
    print('freq '+str(FREQUENCY)) 
    LENGTH = 1 #seconds to play sound 

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


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

    #fill remainder of frameset with silence 
    WAVEDATA+=[128]*RESTFRAMES 

    b = array.array('B', WAVEDATA).tostring() 

    wf.writeframes(b) 
    stream.write(b) 

#print data 
wf.close() 
stream.stop_stream() 
stream.close() 
p.terminate() 
+0

благодаря его работе .. есть несколько кликов из-за проблемы, о которой вы упомянули .. но она работает как очарование для меня :) Спасибо тонну .. –