Как мне воспроизводить звук в Python 2.6.6 при отображении текста?

Я пытаюсь создать программу с Python 2.6.6, которая отображает текст при воспроизведении звука в фоновом режиме. Я дописал только часть текста.

print "Well here we are again"
print "It’s always such a pleasure"
print "Remember when you tried to kill me twice?"
print "Oh, how we laughed and laughed"
print "Except I wasn’t laughing"
print "Under the circumstances I’ve been shockingly nice."

У меня есть файл .wav, который я хотел бы воспроизвести в начале программы. Я также хотел бы, чтобы текст воспроизводился вместе с музыкой (я мог бы указать, когда текст отображается во время песни, например, 00:00:02). Я предполагаю, что это было бы возможно с каким-то аудиомодулем.

Спасибо!


person SS'    schedule 23.05.2011    source источник
comment
Хочешь ответ, возьми его, На это я и рассчитываю, Раньше я желал твоей смерти, но Теперь мне нужно только больше репутации.   -  person wim    schedule 24.05.2011


Ответы (3)


Недавно я сделал нечто подобное и использовал модуль audiere.

import audiere
ds = audiere.open_device()
os = ds.open_array(input, fs)
os.play()

Это откроет первое доступное аудиоустройство, так как вы находитесь в Windows, это, вероятно, DirectSound. input - это просто массив numpy, fs - частота дискретизации (поскольку вход представляет собой необработанный массив, вам нужно указать это). os.play() — это неблокирующий вызов, так что вы можете распечатать свой txt или что-то еще, что вам нужно сделать одновременно, есть и другие способы приостановки/остановки и т. д. Чтобы воспроизводить другие типы файлов, я просто сначала преобразовал их в wav.

Вот как я распаковал wav файл

def wave_unpack(fname):
  """
  input: wave filename as string 
  output: left, right, params

  unpacks a wave file and return left and right channels as arrays
  (in case of a mono file, left and right channels will be copies)

  params returns a tuple containing:
  -number of audio channels (1 for mono, 2 for stereo)
  -sample width in bytes
  -sampling frequency in Hz
  -number of audio frames
  -compression type
  -compression name
  """
  import sndhdr, os, wave, struct
  from scipy import array
      assert os.path.isfile(fname), "file location must be valid"
  assert sndhdr.what(fname)[0] == 'wav', "file must have valid header"
  try:
    wav = wave.open(fname)
    params = (nchannels,sampwidth,rate,nframes,comp,compname) = wav.getparams()
    frames = wav.readframes(nframes*nchannels)
  finally:
    wav.close()
  out = struct.unpack_from ("%dh" % nframes*nchannels, frames)
  if nchannels == 2:
    left = array(out[0::2])
    right = array(out[1::2])
  elif nchannels == 1:
    right = left = array(out)
  else:
    assert 0, "number of channels must be 1 or 2"
  return left, right, params

Так, например, чтобы сделать input и fs, вы можете пойти:

from scipy import c_
left, right, params = wave_unpack(fn)
fs = params[2]
left_float  =  left.astype('f')/2**15
right_float = right.astype('f')/2**15
stereo = c_[left_float, right_float]
input = mono = stereo.mean(1)

Меня это устраивало, но мои требования были для ввода БПФ, а не для караоке :)

Я уверен, что audiere имеет стереофоническое воспроизведение, просто задав 2-мерный массив.

person wim    schedule 24.05.2011

Вы можете найти pygame полезным.

http://www.pygame.org/docs/ref/mixer.html

person dkamins    schedule 23.05.2011

Что вам нужно, так это GStreamer для Python.

Ознакомьтесь с этим руководством. Это хорошее место для начала.

РЕДАКТИРОВАТЬ: В Windows вы можете использовать модуль winsound из стандартной библиотеки (Вау! В Python он есть!) См. winsound документы.

person Zaur Nasibov    schedule 23.05.2011
comment
Я использую Windows, и, насколько я понимаю, GStreamer несовместим с ней. Как мне выполнить эту задачу, используя инструменты, встроенные в Python, или это невозможно? - person SS'; 24.05.2011