code: def run_porcupine(
      self, language, keywords, ground_truth, audio_file_name=None
  ):
      relative_path = "../.."
  
      keyword_paths = get_keyword_paths_by_language(
          relative_path, language, keywords
      )
  
      porcupine = Porcupine(
          access_key=sys.argv[1],
          library_path=pv_library_path(relative_path),
          model_path=get_model_path_by_language(
              relative_path, language
          ),
          keyword_paths=keyword_paths,
          sensitivities=[0.5] * len(keyword_paths),
      )
  
      audio_file = get_audio_file_by_language(
          relative_path, language, audio_file_name
      )
      audio = read_wav_file(audio_file, porcupine.sample_rate)
  
      num_frames = len(audio) // porcupine.frame_length
      results = []
      for i in range(num_frames):
          frame = audio[
              i
              * porcupine.frame_length : (i + 1)
              * porcupine.frame_length
          ]
          result = porcupine.process(frame)
          if result >= 0:
              results.append(result)
  
      porcupine.delete()
  
      self.assertEqual(results, ground_truth)
  
file_path: porcupine/binding/python/test_porcupine.py
imports: import sys
  import unittest
  from parameterized import parameterized
  from _porcupine import Porcupine, PorcupineError
  from test_util import *
label_desc: Use image node_id 1 for calling the PorcupineTestCase obj's underlying member method code with example usage: obj.run_porcupine(language, keywords, ground_truth, audio_file_name) without return types