code: def run(self):
      ppn = None
      recorder = None
  
      try:
          ppn = pvporcupine.create(
              access_key=self._access_key,
              keywords=KEYWORDS,
              sensitivities=[0.75] * len(KEYWORDS),
          )
  
          recorder = PvRecorder(
              device_index=self._device_index,
              frame_length=ppn.frame_length,
          )
          recorder.start()
  
          self._is_ready = True
  
          while not self._stop:
              pcm = recorder.read()
              keyword_index = ppn.process(pcm)
              if keyword_index >= 0:
                  self._keyword_var.set(KEYWORDS[keyword_index])
                  print(self._keyword_var.get())
      finally:
          if recorder is not None:
              recorder.delete()
  
          if ppn is not None:
              ppn.delete()
  
      self._is_stopped = True
  
file_path: porcupine/demo/tkinter/main.py
imports: import argparse
  import tkinter
  from threading import Thread
  import pvporcupine
  from pvrecorder import PvRecorder
label_desc: Use image node_id 2 for calling the PorcupineThread obj's underlying member method code with example usage: obj.run() without return types