Support for HLS transcription (resolves #62)
This commit is contained in:
+46
-3
@@ -11,6 +11,7 @@ import json
|
|||||||
import websocket
|
import websocket
|
||||||
import uuid
|
import uuid
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
def resample(file: str, sr: int = 16000):
|
def resample(file: str, sr: int = 16000):
|
||||||
@@ -344,6 +345,46 @@ class Client:
|
|||||||
wavfile.setframerate(self.rate)
|
wavfile.setframerate(self.rate)
|
||||||
wavfile.writeframes(frames)
|
wavfile.writeframes(frames)
|
||||||
|
|
||||||
|
def process_hls_stream(self, hls_url):
|
||||||
|
"""
|
||||||
|
Connect to an HLS source, process the audio stream, and send it for transcription.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
hls_url (str): The URL of the HLS stream source.
|
||||||
|
"""
|
||||||
|
print("[INFO]: Connecting to HLS stream...")
|
||||||
|
process = None # Initialize process to None
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Launch an FFMPEG process to connect to the HLS stream
|
||||||
|
command = [
|
||||||
|
'ffmpeg',
|
||||||
|
'-i', hls_url, # Input URL
|
||||||
|
'-acodec', 'pcm_s16le', # Output codec
|
||||||
|
'-f', 's16le', # Output format
|
||||||
|
'-ac', '1', # Set audio channels to 1 (mono)
|
||||||
|
'-ar', str(self.rate), # Resample audio to the specified rate
|
||||||
|
'-'
|
||||||
|
]
|
||||||
|
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
|
||||||
|
# Process the stream
|
||||||
|
while True:
|
||||||
|
in_bytes = process.stdout.read(self.chunk * 2) # 2 bytes per sample
|
||||||
|
if not in_bytes:
|
||||||
|
break
|
||||||
|
audio_array = self.bytes_to_float_array(in_bytes)
|
||||||
|
self.send_packet_to_server(audio_array.tobytes())
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ERROR]: Failed to connect to HLS stream: {e}")
|
||||||
|
finally:
|
||||||
|
if process:
|
||||||
|
process.kill()
|
||||||
|
|
||||||
|
print("[INFO]: HLS stream processing finished.")
|
||||||
|
|
||||||
def record(self, out_file="output_recording.wav"):
|
def record(self, out_file="output_recording.wav"):
|
||||||
"""
|
"""
|
||||||
Record audio data from the input stream and save it to a WAV file.
|
Record audio data from the input stream and save it to a WAV file.
|
||||||
@@ -464,7 +505,7 @@ class TranscriptionClient:
|
|||||||
def __init__(self, host, port, is_multilingual=False, lang=None, translate=False):
|
def __init__(self, host, port, is_multilingual=False, lang=None, translate=False):
|
||||||
self.client = Client(host, port, is_multilingual, lang, translate)
|
self.client = Client(host, port, is_multilingual, lang, translate)
|
||||||
|
|
||||||
def __call__(self, audio=None):
|
def __call__(self, audio=None, hls_url=None):
|
||||||
"""
|
"""
|
||||||
Start the transcription process.
|
Start the transcription process.
|
||||||
|
|
||||||
@@ -483,8 +524,10 @@ class TranscriptionClient:
|
|||||||
return
|
return
|
||||||
pass
|
pass
|
||||||
print("[INFO]: Server Ready!")
|
print("[INFO]: Server Ready!")
|
||||||
if audio is not None:
|
if hls_url is not None:
|
||||||
|
self.client.process_hls_stream(hls_url)
|
||||||
|
elif audio is not None:
|
||||||
resampled_file = resample(audio)
|
resampled_file = resample(audio)
|
||||||
self.client.play_file(resampled_file)
|
self.client.play_file(resampled_file)
|
||||||
else:
|
else:
|
||||||
self.client.record()
|
self.client.record()
|
||||||
Reference in New Issue
Block a user