porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py
Go to the documentation of this file.
1 #
2 # Copyright 2021 Picovoice Inc.
3 #
4 # You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE"
5 # file accompanying this source.
6 #
7 # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
8 # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
9 # specific language governing permissions and limitations under the License.
10 #
11 import os
12 import platform
13 import subprocess
14 from ctypes import *
15 from enum import Enum
16 
17 CALLBACK = CFUNCTYPE(None, POINTER(c_int16))
18 
19 
20 class PvRecorder(object):
21  """
22  A cross platform Python SDK for PvRecorder to process audio recordings. It lists the available
23  input devices. Also given the audio device index and frame_length, processes the frame and runs
24  a callback each time a frame_length is given.
25  """
26 
27  class PvRecorderStatuses(Enum):
28  SUCCESS = 0
29  OUT_OF_MEMORY = 1
30  INVALID_ARGUMENT = 2
31  INVALID_STATE = 3
32  BACKEND_ERROR = 4
33  DEVICE_ALREADY_INITIALIZED = 5
34  DEVICE_NOT_INITIALIZED = 6
35  IO_ERROR = 7
36  RUNTIME_ERROR = 8
37 
38  _PVRECORDER_STATUS_TO_EXCEPTION = {
39  PvRecorderStatuses.OUT_OF_MEMORY: MemoryError,
40  PvRecorderStatuses.INVALID_ARGUMENT: ValueError,
41  PvRecorderStatuses.INVALID_STATE: ValueError,
42  PvRecorderStatuses.BACKEND_ERROR: SystemError,
43  PvRecorderStatuses.DEVICE_ALREADY_INITIALIZED: ValueError,
44  PvRecorderStatuses.DEVICE_NOT_INITIALIZED: ValueError,
45  PvRecorderStatuses.IO_ERROR: IOError,
46  PvRecorderStatuses.RUNTIME_ERROR: RuntimeError
47  }
48 
49  class CPvRecorder(Structure):
50  pass
51 
52  def __init__(self, device_index, frame_length, buffer_size_msec=1000, log_overflow=True):
53  """
54  Constructor
55 
56  :param device_index: The device index of the audio device to use. A (-1) will choose default audio device.
57  :param frame_length: The length of the frame to receive at each read call.
58  :param buffer_size_msec: Time in milliseconds indicating the total amount of time to store audio frames.
59  :param log_overflow: Boolean variable to indicate to log overflow warnings. A log warning should indicate
60  read is not being called fast enough from the callers point.
61  """
62 
63  init_func = self._LIBRARY.pv_recorder_init
64  init_func.argtypes = [
65  c_int32,
66  c_int32,
67  c_int32,
68  c_bool,
69  POINTER(POINTER(self.CPvRecorder))
70  ]
71  init_func.restype = self.PvRecorderStatuses
72 
73  self._handle = POINTER(self.CPvRecorder)()
74  self._frame_length = frame_length
75 
76  status = init_func(device_index, frame_length, buffer_size_msec, log_overflow, byref(self._handle))
77  if status is not self.PvRecorderStatuses.SUCCESS:
78  raise self._PVRECORDER_STATUS_TO_EXCEPTION[status]("Failed to initialize pv_recorder.")
79 
80  self._delete_func = self._LIBRARY.pv_recorder_delete
81  self._delete_func.argtypes = [POINTER(self.CPvRecorder)]
82  self._delete_func.restype = None
83 
84  self._start_func = self._LIBRARY.pv_recorder_start
85  self._start_func.argtypes = [POINTER(self.CPvRecorder)]
86  self._start_func.restype = self.PvRecorderStatuses
87 
88  self._stop_func = self._LIBRARY.pv_recorder_stop
89  self._stop_func.argtypes = [POINTER(self.CPvRecorder)]
90  self._stop_func.restype = self.PvRecorderStatuses
91 
92  self._read_func = self._LIBRARY.pv_recorder_read
93  self._read_func.argtypes = [POINTER(self.CPvRecorder), POINTER(c_int16)]
94  self._read_func.restype = self.PvRecorderStatuses
95 
96  self._get_selected_device_func = self._LIBRARY.pv_recorder_get_selected_device
97  self._get_selected_device_func.argtypes = [POINTER(self.CPvRecorder)]
98  self._get_selected_device_func.restype = c_char_p
99 
100  self._version_func = PvRecorder._LIBRARY.pv_recorder_version
101  self._version_func.argtypes = None
102  self._version_func.restype = c_char_p
103 
104  def delete(self):
105  """Releases any resources used by PV_Recorder."""
106 
107  self._delete_func(self._handle)
108 
109  def start(self):
110  """Starts recording audio."""
111 
112  status = self._start_func(self._handle)
113  if status is not self.PvRecorderStatuses.SUCCESS:
114  raise self._PVRECORDER_STATUS_TO_EXCEPTION[status]("Failed to start device.")
115 
116  def stop(self):
117  """Stops recording audio."""
118 
119  status = self._stop_func(self._handle)
120  if status is not self.PvRecorderStatuses.SUCCESS:
121  raise self._PVRECORDER_STATUS_TO_EXCEPTION[status]("Failed to stop device.")
122 
123  def read(self):
124  """Reads audio frames and returns a list containing the audio frames."""
125 
126  pcm = (c_int16 * self._frame_length)()
127  status = self._read_func(self._handle, pcm)
128  if status is not self.PvRecorderStatuses.SUCCESS:
129  raise self._PVRECORDER_STATUS_TO_EXCEPTION[status]("Failed to read from device.")
130  return pcm[0:self._frame_length]
131 
132  @property
133  def selected_device(self):
134  """Gets the current selected device."""
135 
136  device_name = self._get_selected_device_func(self._handle)
137  return device_name.decode('utf-8')
138 
139  @property
140  def version(self):
141  """Gets the current version of pv_recorder library."""
142 
143  version = self._version_func()
144  return version.decode('utf-8')
145 
146  @staticmethod
148  """Gets the audio devices currently available on device.
149 
150  :return: A list of strings, indicating the names of audio devices.
151  """
152 
153  get_audio_devices_func = PvRecorder._LIBRARY.pv_recorder_get_audio_devices
154  get_audio_devices_func.argstype = [POINTER(c_int32), POINTER(POINTER(c_char_p))]
155  get_audio_devices_func.restype = PvRecorder.PvRecorderStatuses
156 
157  free_device_list_func = PvRecorder._LIBRARY.pv_recorder_free_device_list
158  free_device_list_func.argstype = [c_int32, POINTER(c_char_p)]
159  free_device_list_func.restype = None
160 
161  count = c_int32()
162  devices = POINTER(c_char_p)()
163 
164  status = get_audio_devices_func(byref(count), byref(devices))
165  if status is not PvRecorder.PvRecorderStatuses.SUCCESS:
166  raise PvRecorder._PVRECORDER_STATUS_TO_EXCEPTION[status]("Failed to get device list")
167 
168  device_list = list()
169  for i in range(count.value):
170  device_list.append(devices[i].decode('utf-8'))
171 
172  free_device_list_func(count, devices)
173 
174  return device_list
175 
176  @staticmethod
177  def _lib_path():
178  """A helper function to get the library path."""
179 
180  if platform.system() == "Windows":
181  script_path = os.path.join(os.path.dirname(__file__), "scripts", "platform.bat")
182  else:
183  script_path = os.path.join(os.path.dirname(__file__), "scripts", "platform.sh")
184 
185  command = subprocess.run(script_path, stdout=subprocess.PIPE)
186 
187  if command.returncode != 0:
188  raise RuntimeError("Current system is not supported.")
189  os_name, cpu = str(command.stdout.decode("utf-8")).split(" ")
190 
191  if os_name == "windows":
192  extension = "dll"
193  elif os_name == "mac":
194  extension = "dylib"
195  else:
196  extension = "so"
197 
198  return os.path.join(os.path.dirname(__file__), "lib", os_name, cpu, f"libpv_recorder.{extension}")
199 
200  _LIBRARY = cdll.LoadLibrary(_lib_path.__func__())
python.pvrecorder.PvRecorder.start
def start(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:109
python.pvrecorder.PvRecorder._frame_length
_frame_length
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:74
python.pvrecorder.PvRecorder._LIBRARY
_LIBRARY
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:200
python.pvrecorder.PvRecorder
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:20
python.pvrecorder.PvRecorder.__init__
def __init__(self, device_index, frame_length, buffer_size_msec=1000, log_overflow=True)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:52
python.pvrecorder.PvRecorder._start_func
_start_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:84
python.pvrecorder.PvRecorder.delete
def delete(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:104
python.pvrecorder.PvRecorder.CPvRecorder
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:49
python.pvrecorder.PvRecorder._version_func
_version_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:100
python.pvrecorder.PvRecorder.get_audio_devices
def get_audio_devices()
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:147
python.pvrecorder.PvRecorder.PvRecorderStatuses
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:27
python.pvrecorder.PvRecorder._handle
_handle
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:73
python.pvrecorder.PvRecorder._PVRECORDER_STATUS_TO_EXCEPTION
_PVRECORDER_STATUS_TO_EXCEPTION
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:38
python.pvrecorder.PvRecorder._lib_path
def _lib_path()
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:177
python.pvrecorder.PvRecorder.version
def version(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:140
python.pvrecorder.PvRecorder.selected_device
def selected_device(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:133
python.pvrecorder.PvRecorder.read
def read(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:123
python.pvrecorder.PvRecorder.stop
def stop(self)
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:116
python.pvrecorder.PvRecorder._stop_func
_stop_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:88
python.pvrecorder.PvRecorder._get_selected_device_func
_get_selected_device_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:96
python.pvrecorder.PvRecorder._delete_func
_delete_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:80
python.pvrecorder.PvRecorder._read_func
_read_func
Definition: porcupine/demo/c/pvrecorder/sdk/python/pvrecorder.py:92


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:50