Почему голосовой помощник Python работает так медленно? ⇐ Python
Почему голосовой помощник Python работает так медленно?
Я создаю голосового помощника, используя Python 3.12 для MacOS. Сейчас я нахожусь на этапе распознавания голоса, но мне нужно около 6 секунд, чтобы просто распознать мою речь и сказать пользователю: «Чем я могу вам помочь». Я знаю, что для обнаружения молчания было бы лучше использовать pydub, но теперь у меня новейшая версия Python, и около 90% библиотек в настоящее время не поддерживают мою версию Python, и по этой причине я сделал обнаружение тишины с нуля, используя NumPy и SciPy. Следует отметить, что большинство библиотек, которые могут помочь в создании голосового помощника, не поддерживают MacOS (я использую MacOS Monterey). Должен ли я оптимизировать свой код, удалив класс AudioRecorder и переключившись на более старую, но более популярную версию, и продолжить работу, например, на Python 3.10, или мне следует переписать код более эффективным способом, или мое оборудование просто не может нормально справиться с этой программой? Вот мои характеристики:
ОС: macOS 12.6.6 21G646 x86_64 Хост: MacBookPro 12,1 Оболочка: зш 5.8.1 Процессор: Intel i5-5287U (4) @ 2,90 ГГц Графический процессор: Intel Iris Graphics 6100 Память: 16384 МБ Также вот мой код:
импортировать воск импортировать JSON из импорта pyaudio * импортировать numpy как np время импорта импортировать GTTS из pydub импортировать AudioSegment из pydub.playback импортировать воспроизведение класс Аудиорекордер(): def __init__(self, max_silence_duration=1500, sample_rate=16000, chunk_size=1024, Silence_thresh=1000): self.max_silence_duration = max_silence_duration self.sample_rate = sample_rate self.chunk_size = chunk_size self.silence_thresh = Silence_thresh self._frames = b'' self._start_time = Нет self.stream = Нет self.p = Нет защита add_data_to_frames(self, new_data): self._frames += новые_данные def is_silence(self, audio_chunk, Silence_thresh=-300, Energy_thresh=1): энергия = np.sum(audio_chunk.astype(np.float32) ** 2) / float(len(audio_chunk)) вернуть энергию < Energy_thresh или np.max(np.abs(audio_chunk)) < Silence_thresh def Record_audio(self, max_silence_duration=1500, sample_rate=16000, chunk_size=1024, Silence_thresh=1000): self.p = PyAudio() self.stream = self.p.open(format=paInt16, каналы=1, ставка = частота_выборки, ввод=Истина, frames_per_buffer=размер_куска) self._frames = b'' self._start_time = time.time() print("Запись...") пытаться: пока правда: данные = self.stream.read(размер_куска) audio_chunk = np.frombuffer(данные, dtype=np.int16) self.add_data_to_frames(new_data=data) если не self.is_silence(audio_chunk, Silence_thresh=silence_thresh): self._start_time = time.time() elif time.time() - self._start_time >= max_silence_duration/1000.0: перерыв кроме KeyboardInterrupt: print("Запись прервана.") окончательно: print("Запись завершена.") если self.stream и self.stream.is_active(): self.stream.stop_stream() self.stream.close() print("Audiorecouncer.stream закрыт.") если self.p: self.p.terminate() print("PyAudio прекращено.") вернуть self._frames, self.p, self.stream Защиту распознавания_ речи (я, audio_data): path_to_model = "/Users/dimapogarsky/vosk-model-en-us-0.22-lgraph" модель = воск.Модель(путь_к_модели) распознаватель = vosk.KaldiRecouncer(модель, 16000) распознаватель.AcceptWaveform(audio_data) результат = json.loads(распознаватель.Результат()) распознанный_текст = result.get('текст', '') вернуть распознанный_текст защита говорить (текст: ул): tts = gtts.gTTS(text, lang='en') tts.save('привет.wav') песня = AudioSegment.from_file("hello.wav") возвратная пьеса (песня) если __name__ == "__main__": распознаватель = AudioRecorder() пытаться: talk('Чем я могу вам помочь?') audio_recorder_data, p, поток = распознаватель.record_audio() распознанный_текст = распознаватель.распознавать_речь( audio_data=audio_recorder_data) print("Распознанный текст:",распознанный_текст) если «привет» в распознанном_тексте или «привет» в распознанном_тексте: говорить («Здравствуйте, сэр») кроме KeyboardInterrupt: print("Программа прервана. Убираться...") окончательно: если «поток» в locals() и распознавателе.stream не имеет значения None и распознаватель.stream.is_active(): Распознаватель.поток.stop_stream() распознаватель.поток.закрыть() print("Аудиопоток закрыт.") если 'p' в locals(): распознаватель.p.terminate() print("PyAudio прекращен."). Я пробовал использовать pydub и librosa для обнаружения тишины, но хорошей идеей было сделать все с нуля. Проблема в том, что этот метод нагружает процессор гораздо больше, чем другие библиотеки. Пожалуйста, помогите мне.
Я создаю голосового помощника, используя Python 3.12 для MacOS. Сейчас я нахожусь на этапе распознавания голоса, но мне нужно около 6 секунд, чтобы просто распознать мою речь и сказать пользователю: «Чем я могу вам помочь». Я знаю, что для обнаружения молчания было бы лучше использовать pydub, но теперь у меня новейшая версия Python, и около 90% библиотек в настоящее время не поддерживают мою версию Python, и по этой причине я сделал обнаружение тишины с нуля, используя NumPy и SciPy. Следует отметить, что большинство библиотек, которые могут помочь в создании голосового помощника, не поддерживают MacOS (я использую MacOS Monterey). Должен ли я оптимизировать свой код, удалив класс AudioRecorder и переключившись на более старую, но более популярную версию, и продолжить работу, например, на Python 3.10, или мне следует переписать код более эффективным способом, или мое оборудование просто не может нормально справиться с этой программой? Вот мои характеристики:
ОС: macOS 12.6.6 21G646 x86_64 Хост: MacBookPro 12,1 Оболочка: зш 5.8.1 Процессор: Intel i5-5287U (4) @ 2,90 ГГц Графический процессор: Intel Iris Graphics 6100 Память: 16384 МБ Также вот мой код:
импортировать воск импортировать JSON из импорта pyaudio * импортировать numpy как np время импорта импортировать GTTS из pydub импортировать AudioSegment из pydub.playback импортировать воспроизведение класс Аудиорекордер(): def __init__(self, max_silence_duration=1500, sample_rate=16000, chunk_size=1024, Silence_thresh=1000): self.max_silence_duration = max_silence_duration self.sample_rate = sample_rate self.chunk_size = chunk_size self.silence_thresh = Silence_thresh self._frames = b'' self._start_time = Нет self.stream = Нет self.p = Нет защита add_data_to_frames(self, new_data): self._frames += новые_данные def is_silence(self, audio_chunk, Silence_thresh=-300, Energy_thresh=1): энергия = np.sum(audio_chunk.astype(np.float32) ** 2) / float(len(audio_chunk)) вернуть энергию < Energy_thresh или np.max(np.abs(audio_chunk)) < Silence_thresh def Record_audio(self, max_silence_duration=1500, sample_rate=16000, chunk_size=1024, Silence_thresh=1000): self.p = PyAudio() self.stream = self.p.open(format=paInt16, каналы=1, ставка = частота_выборки, ввод=Истина, frames_per_buffer=размер_куска) self._frames = b'' self._start_time = time.time() print("Запись...") пытаться: пока правда: данные = self.stream.read(размер_куска) audio_chunk = np.frombuffer(данные, dtype=np.int16) self.add_data_to_frames(new_data=data) если не self.is_silence(audio_chunk, Silence_thresh=silence_thresh): self._start_time = time.time() elif time.time() - self._start_time >= max_silence_duration/1000.0: перерыв кроме KeyboardInterrupt: print("Запись прервана.") окончательно: print("Запись завершена.") если self.stream и self.stream.is_active(): self.stream.stop_stream() self.stream.close() print("Audiorecouncer.stream закрыт.") если self.p: self.p.terminate() print("PyAudio прекращено.") вернуть self._frames, self.p, self.stream Защиту распознавания_ речи (я, audio_data): path_to_model = "/Users/dimapogarsky/vosk-model-en-us-0.22-lgraph" модель = воск.Модель(путь_к_модели) распознаватель = vosk.KaldiRecouncer(модель, 16000) распознаватель.AcceptWaveform(audio_data) результат = json.loads(распознаватель.Результат()) распознанный_текст = result.get('текст', '') вернуть распознанный_текст защита говорить (текст: ул): tts = gtts.gTTS(text, lang='en') tts.save('привет.wav') песня = AudioSegment.from_file("hello.wav") возвратная пьеса (песня) если __name__ == "__main__": распознаватель = AudioRecorder() пытаться: talk('Чем я могу вам помочь?') audio_recorder_data, p, поток = распознаватель.record_audio() распознанный_текст = распознаватель.распознавать_речь( audio_data=audio_recorder_data) print("Распознанный текст:",распознанный_текст) если «привет» в распознанном_тексте или «привет» в распознанном_тексте: говорить («Здравствуйте, сэр») кроме KeyboardInterrupt: print("Программа прервана. Убираться...") окончательно: если «поток» в locals() и распознавателе.stream не имеет значения None и распознаватель.stream.is_active(): Распознаватель.поток.stop_stream() распознаватель.поток.закрыть() print("Аудиопоток закрыт.") если 'p' в locals(): распознаватель.p.terminate() print("PyAudio прекращен."). Я пробовал использовать pydub и librosa для обнаружения тишины, но хорошей идеей было сделать все с нуля. Проблема в том, что этот метод нагружает процессор гораздо больше, чем другие библиотеки. Пожалуйста, помогите мне.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Пульт дистанционного управления Android TV v2 вызывает голосовой помощник
Anonymous » » в форуме IOS - 0 Ответы
- 36 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Задача: создать прерываемый голосовой помощник с искусственным интеллектом
Anonymous » » в форуме Python - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Пульт дистанционного управления Android TV v2 вызывает голосовой помощник
Anonymous » » в форуме IOS - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-