2014-02-13 5 views
0

Я хочу отрегулировать громкость mp3-файла во время его воспроизведения, отрегулировав потенциометр. Я читаю сигнал потенциометра поочередно через плату Arduino с скриптами python. С помощью библиотеки pydub я могу читать файл, но не могу настроить громкость файла во время его воспроизведения. Это код, который я сделал после длительного поиска. Я указал только часть части Pydub. для вашей информации im, используя медиаплеер vlc для изменения громкости.Как отрегулировать громкость аудиофайла путем последовательного получения сигналов напряжения от потенциометра с помощью платы arduino и скриптов python

>>> from pydub import AudioSegment 
>>> song = AudioSegment.from_wav("C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav") 

Во время воспроизведения файла я не могу настроить значение. Пожалуйста, объясните, как это сделать.

+0

pydub - это библиотека для * управления аудио *; он не воспроизводит аудио [сам по себе] (https://github.com/jiaaro/pydub/blob/master/pydub/playback.py). «Смена громкости», с другой стороны, манипулирует * игроком * - и вы не упомянули [какой игрок вы используете] (https://github.com/jiaaro/pydub/blob/master/pydub/utils .py # L119). Вы должны отредактировать свой вопрос, чтобы все это было понятным - это ** не ** вопрос pydub – goncalopp

+0

дорогой Goncalopp, Спасибо за ваши ответы. Я рассмотрю вопрос редита. Фактически я использую плеер VLC. есть ли библиотека, доступная для манипулирования проигрывателем? или я могу использовать os.system или что-то в этом роде. Спасибо – rajupurush

+0

Вероятно, вы должны проверить [привязки python VLC] (https: //wiki.videolan.org/Python_bindings), то – goncalopp

ответ

0

Сначала вам нужно декодировать свой звуковой сигнал на необработанное аудио и разделить свой сигнал в кадрах X, и вы можете манипулировать своим звуком, и в каждом кадре вы можете изменять громкость или изменять высоту или изменять скорость и т. Д.!

Чтобы изменить громкость, вам просто нужно умножить свой необработанный аудио-вектор на один коэффициент (это может быть ваш сигнал данных потенциометра).

Этот коэффициент может отличаться, если ваш вектор находится в коротким int или формате с плавающей точкой!

Один из способов получить исходные аудиоданные из WAV-файлов в Python использует wave Lib

import wave 

spf = wave.open('wavfile.wav','r') 

#Extract Raw Audio from Wav File 
signal = spf.readframes(-1) 
decoded = numpy.fromstring(signal, 'Float32'); 

Теперь вы можете умножить вектор декодированного один фактор, например, если вы хотите увеличить 10дБ вам необходимо рассчитать 10^(DbValue/20) затем в питона 10**(10/20) = 3.1623

newsignal = decoded * 3.1623; 

Теперь вам нужно кодировать вектор снова играть в новой рамке аудио, вы можете использовать «from struct import pack» и pyaudio сделать это!

stream = pyaud.open(
    format = pyaudio.paFloat32, 
    channels = 1, 
    rate = 44100, 
    output = True, 
    input = True) 

EncodeAgain = pack("%df"%(len(newsignal)), *list(newsignal)) 

И, наконец, играть в свою каркасную аудио, обратите внимание, что вы будете делать это в каждом кадре и играть в одном цикле, этот процесс происходит слишком быстро, и задержка может быть незаметно!

stream.write(EncodeAgain) 

PS: Этот пример предназначен для формата с плавающей точкой!

+0

Хотя это очень полезная информация, обратите внимание, что он хочет изменить громкость * во время воспроизведения файла *, а не изменять амплитуду данных в файле – goncalopp

+0

Да, я знаю, это так, если вы разделите свой звук, который хотите играть в N кадрах, может быть размером = 4096, «stream.write» будет воспроизводить звук на каждом кадре, теперь вы можете изменять амплитуду во время воспроизведения ... – ederwander

+0

Большое спасибо ederwander .. Ты понимаешь мой вопрос и дал точный ответ. это потоковая передача, но я не могу остановить поток, а также я не могу изменить амплитуду ... даже если я убью процесс, который файл постоянно работает. Его можно остановить только при перезапуске компьютера. – rajupurush

0

Ederwander, As u сказал, что у меня есть кодировка treid, но при упаковке данных я получаю полный ноль. так что это не потоковая передача. Я понимаю, что проблема может возникать при преобразовании типов данных формата. Это код, который я написал. Пожалуйста, посмотрите на это и скажите предложение

import sys 
    import serial 
    import time 
    import os 
    from pydub import AudioSegment 
    import wave 
    from struct import pack 
    import numpy 
    import pyaudio 
    CHUNK = 1024 

    wf = wave.open('C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav', 'rb') 

    # instantiate PyAudio (1) 
    p = pyaudio.PyAudio() 

    # open stream (2) 
    stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True) 

    # read data 
    data_read = wf.readframes(CHUNK) 
    decoded = numpy.fromstring(data_read, 'int32', sep = ''); 
    data = decoded*3.123 
    while(1): 
      EncodeAgain = struct.pack(h,data) 
      stream.write(EncodeAgain)