Vosk / 豪猪 fehler

问题描述

我有 Vosk a 的问题。豪猪 控制台:

[2021-02-26 07:44:44.413060] Detected porcupine
Traceback (most recent call last):
  File "C:\Users\jens\PycharmProjects\pythonProject2\porcupine_demo_mic.py",line 210,in <module>
    main()
  File "C:\Users\jens\PycharmProjects\pythonProject2\porcupine_demo_mic.py",line 200,in main
    PorcupineDemo(
  File "C:\Users\jens\PycharmProjects\pythonProject2\porcupine_demo_mic.py",line 110,in run
    if rec.AcceptWaveform(pcm):
  File "C:\Users\jens\AppData\Local\Programs\Python\Python39\lib\site-packages\vosk\__init__.py",line 58,in AcceptWaveform
    return _c.vosk_recognizer_accept_waveform(self._handle,data,len(data))
TypeError: initializer for ctype 'char' must be a bytes of length 1,not int

我的代码:

class PorcupineDemo(Thread):

    def __init__(
            self,library_path,model_path,keyword_paths,sensitivities,input_device_index=None,output_path=None):

        """
        Constructor.

        :param library_path: Absolute path to Porcupine's dynamic library.
        :param model_path: Absolute path to the file containing model parameters.
        :param keyword_paths: Absolute paths to keyword model files.
        :param sensitivities: Sensitivities for detecting keywords. Each value should be a number within [0,1]. A
        higher sensitivity results in fewer misses at the cost of increasing the false alarm rate. If not set 0.5 will
        be used.
        :param input_device_index: Optional argument. If provided,audio is recorded from this input device. Otherwise,the default audio input device is used.
        :param output_path: If provided recorded audio will be stored in this location at the end of the run.
        """

        super(PorcupineDemo,self).__init__()

        self._library_path = library_path
        self._model_path = model_path
        self._keyword_paths = keyword_paths
        self._sensitivities = sensitivities
        self._input_device_index = input_device_index

        self._output_path = output_path
        if self._output_path is not None:
            self._recorded_frames = []

    def run(self):
        """
         Creates an input audio stream,instantiates an instance of Porcupine object,and monitors the audio stream for
         occurrences of the wake word(s). It prints the time of detection for each occurrence and the wake word.
         """

        keywords = list()
        for x in self._keyword_paths:
            keywords.append(os.path.basename(x).replace('.ppn','').split('_')[0])

        porcupine = None
        pa = None
        audio_stream = None

        model = Model('C:/Users/jens/PycharmProjects/pythonProject2/german-vosk-model')
        rec = KaldiRecognizer(model,16000)

        try:
            porcupine = pvporcupine.create(
                library_path=self._library_path,model_path=self._model_path,keyword_paths=self._keyword_paths,sensitivities=self._sensitivities)

            pa = pyaudio.PyAudio()

            audio_stream = pa.open(
                rate=porcupine.sample_rate,channels=1,format=pyaudio.paInt16,input=True,frames_per_buffer=porcupine.frame_length,input_device_index=self._input_device_index)

            print('Listening {')
            for keyword,sensitivity in zip(keywords,self._sensitivities):
                print('  %s (%.2f)' % (keyword,sensitivity))
            print('}')

            is_installing = False

            while True:
                pcm = audio_stream.read(porcupine.frame_length)
                pcm = struct.unpack_from("h" * porcupine.frame_length,pcm)

                if self._output_path is not None:
                    self._recorded_frames.append(pcm)

                result = porcupine.process(pcm)
                if result >= 0:
                    is_installing = True
                    print('[%s] Detected %s' % (str(datetime.now()),keywords[result]))

                if is_installing:
                    if rec.AcceptWaveform(pcm):
                        recResult = json.loads(rec.Result())
                        print(recResult['text'])
                        is_installing = False

        except KeyboardInterrupt:
            print('Stopping ...')
        finally:
            if porcupine is not None:
                porcupine.delete()

            if audio_stream is not None:
                audio_stream.close()

            if pa is not None:
                pa.terminate()

            if self._output_path is not None and len(self._recorded_frames) > 0:
                recorded_audio = np.concatenate(self._recorded_frames,axis=0).astype(np.int16)
                soundfile.write(self._output_path,recorded_audio,samplerate=porcupine.sample_rate,subtype='PCM_16')

    @classmethod
    def show_audio_devices(cls):
        fields = ('index','name','defaultSampleRate','maxInputChannels')

        pa = pyaudio.PyAudio()

        for i in range(pa.get_device_count()):
            info = pa.get_device_info_by_index(i)
            print(','.join("'%s': '%s'" % (k,str(info[k])) for k in fields))

        pa.terminate()


def main():
    parser = argparse.ArgumentParser()

    parser.add_argument(
        '--keywords',nargs='+',help='List of default keywords for detection. Available keywords: %s' % ','.join(sorted(pvporcupine.KEYWORDS)),choices=sorted(pvporcupine.KEYWORDS),metavar='')

    parser.add_argument(
        '--keyword_paths',help="Absolute paths to keyword model files. If not set it will be populated from `--keywords` argument")

    parser.add_argument('--library_path',help='Absolute path to dynamic library.',default=pvporcupine.LIBRARY_PATH)

    parser.add_argument(
        '--model_path',help='Absolute path to the file containing model parameters.',default=pvporcupine.MODEL_PATH)

    parser.add_argument(
        '--sensitivities',help="Sensitivities for detecting keywords. Each value should be a number within [0,1]. A higher " +
             "sensitivity results in fewer misses at the cost of increasing the false alarm rate. If not set 0.5 " +
             "will be used.",type=float,default=None)

    parser.add_argument('--audio_device_index',help='Index of input audio device.',type=int,default=None)

    parser.add_argument('--output_path',help='Absolute path to recorded audio for debugging.',default=None)

    parser.add_argument('--show_audio_devices',action='store_true')

    args = parser.parse_args()

    if args.show_audio_devices:
        PorcupineDemo.show_audio_devices()
    else:
        if args.keyword_paths is None:
            if args.keywords is None:
                raise ValueError("Either `--keyword` or `--keyword_paths` must be set.")

            keyword_paths = [pvporcupine.KEYWORD_PATHS[x] for x in args.keywords]
        else:
            keyword_paths = args.keyword_paths('jarvis')

        if args.sensitivities is None:
            args.sensitivities = [0.5] * len(keyword_paths)

        if len(keyword_paths) != len(args.sensitivities):
            raise ValueError('Number of keywords does not match the number of sensitivities.')

        PorcupineDemo(
            library_path=args.library_path,model_path=args.model_path,keyword_paths=keyword_paths,sensitivities=args.sensitivities,output_path=args.output_path,input_device_index=args.audio_device_index).run()


if __name__ == '__main__':
    main()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...