All notable changes to the daily-python SDK will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Fixed type hints for
CallClient.send_app_message()
.
- Added
serialize_none
toCallClient.send_app_message()
to allow forNone
values in object fields to be serialized tonull
or ignored otherwise.
- Fixed an issue in
CallClient.send_app_message()
that would not allow sending an object withNone
values.
-
Added support for sending dial-out DTMF tones via
CallClient.send_dtmf()
. -
Added support for SIP refer with
CallClient.sip_refer()
. -
Added support for SIP call transfers with
CallClient.sip_call_transfer()
. -
Added support for receiving ICE configuration from the SFU.
- The field
participantId
fromDialoutEvent
andDialinEvent
has been renamed tosessionId
.
- Improved meeting move robustness by increasing the number of retries, to account for situations where the backend takes longer to complete the move.
- Added support for
dialin-connected
,dialin-stopped
,dialin-warning
, anddialin-error
events.
- Fixed a deadlock situation that would occur when reading from a virtual speaker before any remote participants joined the room and then trying to exit the application.
-
Added
CallClient.update_transcription()
. This allows choosing which participants should be transcribed. -
Added
EventHandler.on_transcription_updated()
. -
Daily Adaptive Bitrate (ABR) is now supported. (see https://www.daily.co/blog/introducing-daily-adaptive-bitrate/)
-
Fixed a logging-related crash (stack overflow) that could occur when rapidly starting and stopping the SDK.
-
Fixed an issue where missing fields in the domain/room permission config could cause a connection failure.
-
Added
callerId
field toDialoutSettings
. -
Added
CallClient.start_live_stream()
,CallClient.stop_live_stream()
,CallClient.update_live_stream()
,CallClient.add_live_streaming_endpoints()
andCallClient.remove_live_streaming_endpoints()
. -
Added
EventHandler.on_live_stream_updated()
. -
Added support for specifying custom TURN servers via
CallClient.set_ice_config()
. -
Added support for specifying a proxy URL via
CallClient.set_proxy_url()
.
- Transcription property
tier
has been deprecated. Usemodel
instead. See https://developers.deepgram.com/docs/model
-
Fixed an issue that caused app messages sent from the REST API to not be received correctly.
-
Added missing dialin/dialout handlers in
daily.pyi
. -
EventHandler.on_dialin_answered
should beEventHandler.on_dialout_answered
. -
Fixed a crash caused by passing non-serializable data to
CallClient.send_app_message
. -
Fixed
daily.pyi
type completions.
- Fixed an issue that would cause speaker/microphone completion callbacks to not be called if no other participant was in the call.
- Added dial-out event
dialout-answered
.
- Added new example
demos/audio/async_wav_audio_send.py
that shows how to useasyncio
with completion callbacks.
- Fixed an issue where
VideoFrame.timestamp_us
was always 0.
-
Fixed a potential crash caused by audio/video renderers.
-
Fixed an issue with audio/video renderers that was preventing renderers to be removed when participants leave.
- CPU and memory performance improvements.
-
Added
dialin-ready
event. -
Added dial-out events
dialout-connected
,dialout-stopped
,dialout-error
anddialout-warning
.
CallClient.stop_dialout()
now takes the participant ID of the dial-out session we want to stop.
-
Fixed a crash caused by the following completion callbacks:
CallClient.update_inputs()
,CallClient.update_publishing()
,CallClient.update_subscriptions()
,CallClient.update_subscription_profiles()
. The signature of the functions was wrongly documented as only a singleerror
argument is passed. -
Fixed issue when calling
CallClient.update_publishing()
immediately afterCallClient.update_inputs()
.
- Fixed an issue that could cause video and audio renderers not to work if they were registered after the media track was already being received.
- Fixed missing milliseconds in client logs timestamps.
- Fixed an issue that could cause join to fail if recording/transcription/live stream was started from the REST API.
- Added initial support for low-level Voice Activity Detection (VAD).
vad = Daily.create_native_vad(1000, 16000, 1)
confidence = vad.analyze_frames(audio_frames)
-
Added
includeRawResponse
field toTranscriptionSettings
. If true, all incomingTranscriptionMessage
will include a newrawResponse
field with Deepgram's raw data. -
Added new
CallClient.release()
function to allow freeing resources even in the event ofEventHandler
circular dependencies. It is common to have the following code:
class MyClient(EventHandler):
def __init__(self):
self.call_client=CallClient(event_handler=self)
...
If MyClient
is a single application there shouldn't be any issues with
freeing resources when the application ends. However, if we have an
application that wants to create and release multiple CallClient
instances
the previous approach won't work with Python's garbage collection since
there's a circular dependency. To solve this, we can now do:
class MyClient(EventHandler):
def __init__(self):
self.call_client=CallClient(event_handler=self)
def leave(self):
self.call_client.leave()
self.call_client.release()
...
The new CallClient.release()
function also blocks until all previous
asynchronous operations have completed, so it's another convenient way to
know, for example, when CallClient.leave()
finishes.
-
⚠️ Breaking change⚠️ : Completion callbacks now receive only the necessary arguments. For example, beforeCallClient.leave(completion=...)
completion callback would receive(None, Error | None)
arguments when it should only receive(Error | None)
.This is the list of functions with completion callbacks that have been affected:
CallClient.leave()
,CallClient.update_remote_participants()
,CallClient.eject_remote_participants()
,CallClient.update_permissions()
,CallClient.start_recording()
,CallClient.stop_recording()
,CallClient.update_recording()
,CallClient.start_transcription()
,CallClient.stop_transcription()
,CallClient.start_dialout()
,CallClient.stop_dialout()
,CallClient.send_app_message()
,CallClient.send_prebuilt_chat_message()
.If you use any of the completion callbacks from one of the functions listed above, you simply need to remove the first argument from your callable.
- Updated demos to use the new
CallClient.release()
function.
- Fixed an issue that would not allow join to succeed if a React Native client was already in the room.
- Add support for
audio-only
recording layout preset.
-
Virtual microphones now always send audio (silence) if the user doesn't provide audio frames.
-
Fix deadlock when registering completion callbacks inside callbacks.
-
Enable Opus FEC to improve audio with network packet loss.
-
Fixed multiple issues which could cause a deadlock during network reconnection.
-
Ensure that
CallClient.update_inputs()
continues to be usable while the network is down. -
Fixed a crash which could occur if the network connection drops soon after joining.
-
Simplied demos by using
client_settings
parameter inCallClient.join()
instead of a separateCallClient.update_inputs()
call. -
Updated
pyaudio
demo to only use non-blocking virtual devices.
- Disable Opus DTX (discontinuous transmission). This improves audio quality and fixes issues on recordings.
-
Added
punctuate
andendpointing
fields toTranscriptionSettings
. -
Added dialout support with
CallClient.start_dialout()
andCallClient.stop_dialout()
. -
Added completion callbacks to
VirtualMicrophone.write_frames()
andVirtualSpeaker.read_frames()
. This change makes virtual devices completely asynchronous if they are created withnon_blocking
set toTrue
.
- Renamed
session_id
field toparticipantId
inTranscriptionMessage
.
- Removed
is_final
,user_id
anduser_name
fields fromTranscriptionMessage
.
-
Room deletion messages from the server are now properly handled.
-
CallClient.send_app_message(None)
now properly triggers aValueError
exception. -
If an invalid participant ID is passed to
CallClient.send_app_message()
it will now trigger aValueError
exception. -
Fixed an issue that would cause audio crackling and popping when using non-blocking devices.
-
Fixed support for different audio sample rates and number of channels, other than 16000 and 1 channel.
-
Don't quote the participant ID when passing the string to video/audio renderer callbacks.
-
Fixed a potential crash on shutdown when using a virtual camera device.
-
Emit
transcription-started
event if transcription is already started when joining the room.
- Added GStreamer media player demo.
- Fixed another issue that could cause
CallClient.join()
to fail if another Daily web client was also joining at the same time.
- Fixed an issue that could cause
CallClient.join()
to fail if another Daily web client was also joining at the same time.
- Disabled echo cancellation, noise suppression and auto gain control by default to match the previous library behavior.
- Fixed a crash when passing audio frames to
VirtualMicrophone.write_frames()
that require padding (i.e. non-multiple of 10ms worth of audio frames).
-
Support for non-blocking virtual audio devices. This allows integration with hardware devices (e.g. via PyAudio).
-
Echo cancellation, noise suppression and auto gain control can now be enabled for virtual microphones via custom constraints.
-
It is now possible to pass additional Deepgram settings to
start_transcription()
using the newextra
field.
-
Transcription defaults have been removed in favor of Deepgram's defaults. This allows to simply specify
{"model": "nova-2"}
. -
Transcription
redact
can now also be a list of strings as supported by Deepgram (e.g.["pci"]
).
- Fixed an issue on user leave (manual or by the server) that would prevent the user to rejoin.
- New demos to show how to integrate with PyAudio, how to send images and other improvements in existing demos.
-
Added support for capturing individual participant audio tracks.
-
Added support for ejecting participants.
-
Support python >= 3.7 and, on Linux, glibc >= 2.28.
-
Transcription defaults have been removed in favor of Deepgram's defaults. This allows to simply specify
{"model": "nova-2"}
. -
Transcription redact can now also be a list of strings as supported by Deepgram (e.g.
["pci"]
).
-
Fixed a deadlock that would not allow receiving multiple simultaneous video renderers.
-
Fixed a deadlock when a screen share was stopped.
-
Fixed an issue where setting the user name could not be reflected automatically when requesting participants list.
-
Fixed an issue that could cause joins/reconnects to not complete successfully.
-
Fixed a sporadic crash that could occur when handling media streams.
-
Improved general video renderer performance.
-
Improved media subscriptions stability and performance.
-
Added Qt demo (similar to the existing Gtk demo).
-
Qt and Gtk demos can now save the selected participant audio into a WAV file and can also render screen share.
-
Fixed an issue that could cause daily-python clients to join a session in a different region.
-
Fixed a dead-lock that could occur when a
CallClient
is destroyed.
-
Support for sending chat messages to Daily Prebuilt (
CallClient.send_prebuilt_chat_message()
). -
Added Python type hints (helpful for editor completions).
-
Support for Python 3.8.
EventHandler.on_transcription_stopped
can now tell if transcription was stopped by a user or because of an error occurred.
- Removed
detect_language
fromTranscriptionSettings
.
-
Improved response time of
CallClient
getter functions. -
Improved low-latency performace of virtual audio devices.
-
Fixed potential crash after
CallClient.leave()
. -
Improved internal safeness of participant video renderers.
-
Fixed a
VirtualMicrophoneDevice
memory leak. -
Properly trigger a transcription error event if transcription can't start.
- Demos have been updated to show more real live code.
-
Support for start/stop recordings.
-
Support for start/stop transcriptions and receive transcriptions messages.
-
VirtualSpeakerDevice.read_frames()
has been improved and doesn't require the user to add sleeps. Therefore, it is now possible to read, for example, 10 seconds of audio in a single call. Since the timings are now controlled internally, this minimizes any potential audio issues.The following old code:
SAMPLE_RATE = 16000
READ_INTERVAL = 0.01
FRAMES_TO_READ = int(SAMPLE_RATE * READ_INTERVAL)
SECONDS_TO_READ = 10.0
for _ in range (int(SECONDS_TO_READ / READ_INTERVAL)):
buffer = speaker.read_frames(FRAMES_TO_READ)
time.sleep(READ_INTERVAL)
can be replaced with:
SECONDS_TO_READ = 10
FRAMES_TO_READ = SAMPLE_RATE * SECONDS_TO_READ
buffer = speaker.read_frames(FRAMES_TO_READ)
-
Fixed an issue that was causing sporadic audio gaps on macOS and in certain OS task scheduling scenarios.
-
Network re-connections have been improved.
- Fixed an issue where virtual devices could cause other Python threads to be blocked.