After having tried many solutions, this has worked!
For future reference, the issue I was experiencing was with the "Spoken Content" accessibility feature starting to glitch and pause the audio.
I could see multiple instances of the coreaudiod process outputting the following in Console.app:
coreaudiod Audio IO Overload thread: 5debaa inputs: '<private>' outputs: '<private>' cause: 'Unknown' prewarming: no recovering: no
default 09:13:49.765045+0100 coreaudiod CAReportingClient.mm:508 message {
HostApplicationDisplayID = Unknown;
cause = PageFaultsOffIOThread;
deadline = 30204924;
"input_device_source_list" = "";
"input_device_transport_list" = "";
"input_device_uid_list" = "";
"io_buffer_size" = 512;
"io_cycle" = 789;
"io_page_faults" = 0;
"is_prewarming" = 0;
"is_recovering" = 0;
"issue_type" = overload;
lateness = 198;
"other_page_faults" = 47;
"output_device_source_list" = Unknown;
"output_device_transport_list" = Bluetooth;
"output_device_uid_list" = "C:output";
"sample_rate" = 48000;
"smallest_buffer_frame_size" = 512;
}: (
1829656068372
)