Получите амплитуду записанного звука с помощью Python, используя SL4A

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

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

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

ОБНОВЛЕНИЕ:

Мне удалось импортировать модуль 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)

person Radu Gheorghiu    schedule 23.03.2012    source источник


Ответы (1)


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

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

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

person bkconrad    schedule 23.03.2012
comment
Надо будет попробовать, идея звучит многообещающе. - person Radu Gheorghiu; 24.03.2012
comment
Итак, мне удалось записать звук, и я использовал модули import wave, audioop, это не говорит об ошибке, но когда я пытаюсь использовать wave.open(), он говорит, что не может найти файл wave.py.. Итак, я искал для этого, и я пытаюсь сделать его модулем, который я импортирую в свой проект, и, надеюсь, я решу эту проблему. Еще раз спасибо за подсказки! - person Radu Gheorghiu; 05.05.2012