Natecat
Natecat

Reputation: 2182

How to play a sound onto a input stream

I was wondering if it was possible to play a sound directly into a input from python. I am using linux, and with that I am using OSS, ALSA, and Pulseaudio

Upvotes: 0

Views: 4196

Answers (2)

FredFury
FredFury

Reputation: 2511

I guess it depends on what you would like to do with it after you got it "into" python. I would definitely look at the scikits.audiolab library. That's what you might use if you wanted to draw up spectrograms of what ever sound you are trying process (I'm guessing that's what you want to do?).

Upvotes: -1

ArtiZirk
ArtiZirk

Reputation: 106

You can definitely play (and generate) sound with python

Here is a example code that generates sinewave, opens default Alsa playback device and plays sinewave through that

#!/usr/bin/env python3
import math
import struct
import alsaaudio
from itertools import *

def sine_wave(frequency=440.0, framerate=44100, amplitude=0.5):
    """Stolen from here: http://zacharydenton.com/generate-audio-with-python/"""
    period = int(framerate / frequency)
    if amplitude > 1.0: amplitude = 1.0
    if amplitude < 0.0: amplitude = 0.0
    lookup_table = [float(amplitude) * math.sin(2.0*math.pi*float(frequency)*(float(i%period)/float(framerate))) for i in range(period)]
    return (lookup_table[i%period] for i in count(0))

sound_out = alsaaudio.PCM()  # open default sound output
sound_out.setchannels(1)  # use only one channel of audio (aka mono)
sound_out.setrate(44100)  # how many samples per second
sound_out.setformat(alsaaudio.PCM_FORMAT_FLOAT_LE)  # sample format

for sample in sine_wave():
    # alsa only eats binnary data
    b = struct.pack("<f", sample)  # convert python float to binary float
    sound_out.write(b)

or you can loopback microphone to your speakers

#!/usr/bin/env python3
import struct
import alsaaudio

sound_out = alsaaudio.PCM()  # open default sound output
sound_out.setchannels(1)  # use only one channel of audio (aka mono)
sound_out.setperiodsize(5) # buffer size, default is 32

sound_in = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE)  # default recording device
sound_in.setchannels(1)  # use only one channel of audio (aka mono)
sound_in.setperiodsize(5) # buffer size, default is 32

while True:
    sample_lenght, sample = sound_in.read()
    sound_out.write(sample)

much more examples can be found in python alsaaudio library http://pyalsaaudio.sourceforge.net/libalsaaudio.html

Upvotes: 3

Related Questions