Получить амплитуду записанного звука с Python с помощью SL4A - PullRequest
1 голос
/ 24 марта 2012

Я хочу записать звук в течение 1 секунды, используя приложение, написанное на Python для SL4A, а затем найти максимальную амплитуду звука.

Есть ли какая-либо часть API SL4A, которую я могу использовать, или часть API Python, которую можно использовать? Или есть какой-нибудь модуль Python, который я могу установить по этому вопросу?

Я искал Python API из SL4A, но не нашел ничего, связанного с амплитудой. Может быть, я просто пропустил это.

UPDATE:

Мне удалось импортировать модуль wave.py в мой код и попытаться открыть записанный файл. Но когда я получаю доступ к

wave.open("/sdcard/sl4aTemp/sound_sample.wav")

выдает эту ошибку,

File does not start with RIFF id

Для тех из вас, кому интересно, как мой код выглядит здесь:

import android, audioop, time, wave

droid = android.Android()

print "Recording starts in: "
for i in range(0,5):
    time.sleep(1)
    print str(5-i)
time.sleep(1)

print "Speak!"
droid.recorderStartMicrophone('/sdcard/sl4aTemp/sound_sample.wav')
time.sleep(3)
droid.recorderStop()

print "Processing file in:"
for i in range(0,3):
    print str(3-i)
    time.sleep(1)

filename = "/sdcard/sl4aTemp/sound_sample.wav"

if wave.open(filename,"r") == True:
    print "Processing " + filename
else:
    print "File not processed"

FILE=wave.open(filename,"r")
rez=FILE.readframes(30)
print str(rez)

1 Ответ

1 голос
/ 24 марта 2012

Стандартный ответ на обработку звука с помощью python - это PyAudio, который представляет собой отдельный пакет, который на самом деле зависит от PortAudio, который, вероятно, не был создан для Android, так что это не очень хорошее решение (если только вы не хотите стать героем и пытаться чтобы заставить его строить).

Другим вариантом является audioop модуль . Проблема в том, что вам нужно будет конвертировать любой формат, в котором сохранен этот файл, в формат, поддерживаемый audioop (строки целых 8/16/32-битных целочисленных образцов). Трудно сказать, как вы это сделаете, но если вам действительно повезет, это будет файл .wav, и вы можете просто использовать readframeswave модуля *1009* (который удобно выводит данные в виде строки байтов).

Итак, если SL4A реализует все ядро ​​Python, вы можете быть в состоянии сделать это без каких-либо зависимостей.

...