Я пытаюсь создать приложение с разницей в телефонной связи, которое распознает такие песни, как shazam. Я использую dejavu, отличный скрипт на python, но у меня возникают проблемы, когда я пытаюсь распознать образцы песен, записанные на моем смартфоне. Dejavu хорошо работает, когда распознает образцы записанных песен с ПК, но со смартфоном я не могу понять, как использовать «micRecognition». Я попробовал «fileRecognition» с записанными песнями на своем смартфоне: я сохранил семпл в файл и отправил его на сервер, где работает dejavu, но, очевидно, он распознает разные песни из-за качества / фонового шума.
Итак, я пытаюсь использовать два плагина:
- Плагин PhoneGap Media Stream, но я не знаю, как его использовать при записи аудио;
- cordova-plugin-audioinput, но в этом случае я не могу понять, делает ли этот плагин то, что я хочу.
Это dejavu MicrophoneRecognizer, и я запускаю его на centos 6.9 с python 2.7
class MicrophoneRecognizer(BaseRecognizer):
default_chunksize = 8192
default_format = pyaudio.paInt16
default_channels = 2
default_samplerate = 44100
def __init__(self, dejavu):
super(MicrophoneRecognizer, self).__init__(dejavu)
self.audio = pyaudio.PyAudio()
self.stream = None
self.data = []
self.channels = MicrophoneRecognizer.default_channels
self.chunksize = MicrophoneRecognizer.default_chunksize
self.samplerate = MicrophoneRecognizer.default_samplerate
self.recorded = False
def start_recording(self, channels=default_channels,
samplerate=default_samplerate,
chunksize=default_chunksize):
self.chunksize = chunksize
self.channels = channels
self.recorded = False
self.samplerate = samplerate
if self.stream:
self.stream.stop_stream()
self.stream.close()
self.stream = self.audio.open(
format=self.default_format,
channels=channels,
rate=samplerate,
input=True,
frames_per_buffer=chunksize,
)
self.data = [[] for i in range(channels)]
def process_recording(self):
data = self.stream.read(self.chunksize)
nums = np.fromstring(data, np.int16)
for c in range(self.channels):
self.data[c].extend(nums[c::self.channels])
def stop_recording(self):
self.stream.stop_stream()
self.stream.close()
self.stream = None
self.recorded = True
def recognize_recording(self):
if not self.recorded:
raise NoRecordingError("Recording was not complete/begun")
return self._recognize(*self.data)
def get_recorded_time(self):
return len(self.data[0]) / self.rate
def recognize(self, seconds=10):
self.start_recording()
for i in range(0, int(self.samplerate / self.chunksize
* seconds)):
self.process_recording()
self.stop_recording()
return self.recognize_recording()