Как играть musi c в левом динамике и голос микрофона в правом динамике с raspberry pi python? - PullRequest
0 голосов
/ 12 июля 2020

У меня USB mi c и raspberry pi. Вот что я пытаюсь сделать.

У меня есть файл «musi c .wav», в котором звуковая дорожка настроена на левый канал, и у меня есть USB mi c, подключенный к raspberry pi.

Когда я играю "musi c .wav" и говорю на mi c. Я слышу musi c в левом динамике и голос mi c в левом и правом динамиках.

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

Может кто-нибудь мне поможет, как ограничить musi c только в левом динамике и голос только в правом динамике с использованием python языка?

Код ниже для голоса с микрофона, поступающего в оба динамика. Необходимо ограничить только правый динамик. Пожалуйста, помогите !!

import pyaudio
import os
import numpy as np

chunk=2800
RATE=44100

p=pyaudio.PyAudio()

#input stream setup
stream=p.open(format = pyaudio.paInt16,rate=RATE,channels=1, 
input_device_index = 1, input=True, frames_per_buffer=chunk)

#the code below is from the pyAudio library documentation referenced 
#below
#output stream setup
player=p.open(format = pyaudio.paInt16,rate=RATE,channels=1, 
output=True, frames_per_buffer=chunk)

while True:            #Used to continuously stream audio
   try:
       data=np.fromstring(stream.read(chunk,exception_on_overflow 
       =False),dtype=np.int16)
       player.write(data,chunk)
   except IOError:
       continue

#closes streams
stream.stop_stream()
stream.close()
p.terminate   

ОБНОВЛЕНИЕ: После многих попыток я выполнил приведенный ниже код: Теперь голос нечеткий, но я все еще попадая в оба динамика ... Я также поменял "плеер" - выходной канал на 2 .. Не повезло !!

import pyaudio
import os
import numpy as np

  
chunk=2800
RATE=44100

p=pyaudio.PyAudio()

#input stream setup
stream=p.open(format = pyaudio.paInt16,rate=RATE,channels=1, 
input_device_index = 1, input=True, frames_per_buffer=chunk)

player=p.open(format = pyaudio.paInt16,rate=RATE,channels=1, 
output=True, 
frames_per_buffer=chunk) #tried changing channels=2

while True:            #Used to continuously stream audio
   try:
      data=np.fromstring(stream.read(chunk,exception_on_overflow = 
      False),dtype=np.int16)    
      chunk_length = int(len(data)/2)           
      result = np.reshape(data, (chunk_length, 2),order='f')
      #result = np.reshape(data, (chunk_length, 2))  
      print(result)

      rightchannel=result[:, 1] #I need right
      #leftchannel=result[:, 0]
   
      print(rightchannel)
      player.write(rightchannel,chunk_length)
      #player.write(result,chunk)
  except IOError:
      continue

ОБНОВЛЕНИЕ 2:

stream=p.open(format = pyaudio.paInt16,rate=RATE,channels=1, 
input_device_index = 1, input=True, frames_per_buffer=chunk)
player=p.open(format = pyaudio.paInt16,rate=RATE,channels=2, 
output=True, 
frames_per_buffer=chunk)

while True:            #Used to continuously stream audio
   try:
      data=np.fromstring(stream.read(chunk,exception_on_overflow = 
      False),dtype=np.int16)    
      chunk_length = int(len(data)/2)           
      result = np.reshape(data, (chunk_length, 2))     
      print(result)
      rightchannel=result[:, 1] #I need right
      #leftchannel=result[:, 0]      
      print(rightchannel)
      player.write(rightchannel,chunk)      
  except IOError:
      continue
 
  **ERROR**>>>>
  [[185 179]
  [183 175]
  [190 197]
  ..., 
  [156 156]
  [149 144]
  [145 146]]
  [179 175 197 ..., 156 144 146]
  Traceback (most recent call last):
  File 
  "/home/pi/RKR_MainAudioBase/Audio_GUI_RKR/MicFuncFiles/recorder.py", 
  line 25, in <module>
  player.write(rightchannel,chunk)
  File "/usr/lib/python3/dist-packages/pyaudio.py", line 586, in write
  exception_on_underflow)
  ValueError: ndarray is not C-contiguous

1 Ответ

0 голосов
/ 21 июля 2020
• 1000 Например, чтобы сделать стерео, просто сделайте выходной канал плеера = 2 и преобразуйте данные в dataout = [1 1 2 2 3 3 4 4 5 5 6 6] в этом формате, который является [L0 R0 L1 R1 ... и т. д.]. затем "player.write (dataout, chunk)".

И чтобы иметь контроль над правым каналом, сделайте каждый 2-й, 4-й, 6-й и т. д. c элемент позиции как 0 ex: dataout = [1 0 2 0 3 0 4 0 5 0 6 0] и для левого канала сделать 1-й, 3-й, 5-й элемент как 0. dataout = [0 1 0 2 0 3 0 4 0 5 0 6]

Работает отлично !!!!

...