From fad08425717ce979bd8b5134438a9feecdfd3cff Mon Sep 17 00:00:00 2001 From: makaveli10 Date: Mon, 25 Sep 2023 16:25:20 +0530 Subject: [PATCH] add client docs --- docs/doctrees/environment.pickle | Bin 96085 -> 145782 bytes docs/doctrees/index.doctree | Bin 61568 -> 95455 bytes docs/html/genindex.html | 55 ++++++++++++- docs/html/index.html | 134 +++++++++++++++++++++++++++++++ docs/html/objects.inv | Bin 443 -> 544 bytes docs/html/searchindex.js | 2 +- whisper_live/client.py | 3 + 7 files changed, 190 insertions(+), 4 deletions(-) diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle index c828d9d8aa78b7b1874dacb41da9c717ee2200bd..0923b6676c7aa4e664777ed3ecfe37edc4b5f21c 100644 GIT binary patch delta 27181 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 diff --git a/docs/doctrees/index.doctree b/docs/doctrees/index.doctree index b4c99e483b7c960e3530d88370daf24949a61840..be33d87a80c885feea401b79367a6d4040d7ba3c 100644 GIT binary patch literal 95455 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 a){rT-7=@PXR^ delta 2294 zcmah}Z%k8H6z{o(N_p=UD_T)02veX?8Bh=e3@}B9Y`O~KpViF*)yESMDcv-43vN?~ z!8mujT(@lcVMen_6j0Zx+l2bJ=j1em_`>`^#qw;5hD6XvH)K*&9#C_odLO-^RTYn8E%nh7!1>f-b6{Ybxj> zf)Z)!87mBhffply8{sz<6XX~|1bXQ2MG)kf$W(#4k3C0%5z+DV^k+vQpRPJz$5PAT z1T3VRE}+`(u;Qdx*`hcE=1vAn;J{)y1f*J^=7SDtsi4!zwpzXB&)*2PKu-nCC1is@ z#|y)L0sRdE%`ci4NO%gK)RV0O6|OH}u4*VEJ|1c}dO4Lv*($Ir)$l1suZod05U8D`ksMOAa{A3-T0HHVVD!9)49$mp(@RYysc$Jf{1LK z63f5gh6R#?qcdc^oT)4oX#W~J%gBQj7K^CUDP?+GX7XLRwxeUWirE)=;9|e5g5ODj zNTDi)jW{5ghD;O)2zYxUW&!j2||#8aw4n5gXDeRSifFH;nNgebFuK~TUqkJ4g4B~wp0c(@k%@^Sf@=+9_5g|u4!p}Fs zc5*g~Fdn@F8X*Qn5ONq2s)MnNm!=IytHcLG%Hcmlvs8*S?QJXD)CkrY!x*TI$_U@7 zqcTE&yj8*{C63)}gdy@XuP%q)(8uVN`w|;#g0|ck6Vhp&q|=2OObJ`FAk(nlz=7HsAwY@UsEc~HKD8#@+_=8{&!ZxDX=ID58i}Elm zkq4~A5djms=Yia3OCDQW*cw$^$SRwA A + | B | C | D | F | G | M + | O + | P | R | S | T @@ -53,10 +56,24 @@ +

B

+ + +
+

C

+
@@ -79,6 +96,10 @@

G

+
+

O

+ + + +
+ +

P

+ + +
+

R

@@ -117,10 +160,12 @@

S

@@ -156,8 +201,6 @@
  • module
  • - - +
    • whisper_live.server @@ -166,6 +209,12 @@
    diff --git a/docs/html/index.html b/docs/html/index.html index 1539dd3..c8b3e33 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -220,6 +220,140 @@ port (int): The port number to bind the server.

    +
    +class whisper_live.client.Client(host=None, port=None, is_multilingual=False, lang=None, translate=False)
    +

    Handles audio recording, streaming, and communication with a server using WebSocket.

    +
    +
    +static bytes_to_float_array(audio_bytes)
    +

    Convert audio data from bytes to a NumPy float array.

    +

    It assumes that the audio data is in 16-bit PCM format. The audio data is normalized to +have values between -1 and 1.

    +
    +
    Args:

    audio_bytes (bytes): Audio data in bytes.

    +
    +
    Returns:

    np.ndarray: A NumPy array containing the audio data as float values normalized between -1 and 1.

    +
    +
    +
    + +
    +
    +close_websocket()
    +

    Close the WebSocket connection and join the WebSocket thread.

    +

    First attempts to close the WebSocket connection using self.client_socket.close(). After +closing the connection, it joins the WebSocket thread to ensure proper termination.

    +
    + +
    +
    +get_client_socket()
    +

    Get the WebSocket client socket instance.

    +
    +
    Returns:

    WebSocketApp: The WebSocket client socket instance currently in use by the client.

    +
    +
    +
    + +
    +
    +on_message(ws, message)
    +

    Callback function called when a message is received from the server.

    +

    It updates various attributes of the client based on the received message, including +recording status, language detection, and server messages. If a disconnect message +is received, it sets the recording status to False.

    +
    +
    Args:

    ws (websocket.WebSocketApp): The WebSocket client instance. +message (str): The received message from the server.

    +
    +
    +
    + +
    +
    +on_open(ws)
    +

    Callback function called when the WebSocket connection is successfully opened.

    +

    Sends an initial configuration message to the server, including client UID, multilingual mode, +language selection, and task type.

    +
    +
    Args:

    ws (websocket.WebSocketApp): The WebSocket client instance.

    +
    +
    +
    + +
    +
    +play_file(filename)
    +

    Play an audio file and send it to the server for processing.

    +

    Reads an audio file, plays it through the audio output, and simultaneously sends +the audio data to the server for processing. It uses PyAudio to create an audio +stream for playback. The audio data is read from the file in chunks, converted to +floating-point format, and sent to the server using WebSocket communication. +This method is typically used when you want to process pre-recorded audio and send it +to the server in real-time.

    +
    +
    Args:

    filename (str): The path to the audio file to be played and sent to the server.

    +
    +
    +
    + +
    +
    +record(out_file='output_recording.wav')
    +

    Record audio data from the input stream and save it to a WAV file.

    +

    Continuously records audio data from the input stream, sends it to the server via a WebSocket +connection, and simultaneously saves it to multiple WAV files in chunks. It stops recording when +the RECORD_SECONDS duration is reached or when the RECORDING flag is set to False.

    +

    Audio data is saved in chunks to the “chunks” directory. Each chunk is saved as a separate WAV file. +The recording will continue until the specified duration is reached or until the RECORDING flag is set to False. +The recording process can be interrupted by sending a KeyboardInterrupt (e.g., pressing Ctrl+C). After recording, +the method combines all the saved audio chunks into the specified out_file.

    +
    +
    Args:

    out_file (str, optional): The name of the output WAV file to save the entire recording. Default is “output_recording.wav”.

    +
    +
    +
    + +
    +
    +send_packet_to_server(message)
    +

    Send an audio packet to the server using WebSocket.

    +
    +
    Args:

    message (bytes): The audio data packet in bytes to be sent to the server.

    +
    +
    +
    + +
    +
    +write_audio_frames_to_file(frames, file_name)
    +

    Write audio frames to a WAV file.

    +

    The WAV file is created or overwritten with the specified name. The audio frames should be +in the correct format and match the specified channel, sample width, and sample rate.

    +
    +
    Args:

    frames (bytes): The audio frames to be written to the file. +file_name (str): The name of the WAV file to which the frames will be written.

    +
    +
    +
    + +
    +
    +write_output_recording(n_audio_file, out_file)
    +

    Combine and save recorded audio chunks into a single WAV file.

    +

    The individual audio chunk files are expected to be located in the “chunks” directory. Reads each chunk +file, appends its audio data to the final recording, and then deletes the chunk file. After combining +and saving, the final recording is stored in the specified out_file.

    +
    +
    Args:

    n_audio_file (int): The number of audio chunk files to combine. +out_file (str): The name of the output WAV file to save the final recording.

    +
    +
    +
    + +
    + +
    class whisper_live.client.TranscriptionClient(host, port, is_multilingual=False, lang=None, translate=False)

    Client for handling audio transcription tasks via a WebSocket connection.

    diff --git a/docs/html/objects.inv b/docs/html/objects.inv index eac02a78c6d0227c0fc91fbb116e91215e0b8bd2..ca8d1416a8743e6170079b79f18d1fe9e3f446bf 100644 GIT binary patch delta 431 zcmV;g0Z{(C1E2(udw*5SZo)7Syyq)iwbw-D%C)CTtyGCh9IeG(6044F`9a9v*Tz6W zAZQX!Np^R}`g@<- z5}YHmQ|xU}wdy@O>NQ##2n1bOD<>|0)WzLIy#Jot13~5x55_&4)5?(pX^eE-Qk=Z`;{^ny(ymw$weU-3^=`~vINr`;)xmE*KLMt@H++p2Y88xz3ri{dW)lsjXbF6$}WwEx@Et+G51(ItG->6x+VyEb_j=hh| z;ieh;z}ThNGN1 diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index b1d0043..d75d57a 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["Welcome to Whisper Live documentation!"], "terms": {"class": 0, "server": 0, "servecli": 0, "websocket": 0, "task": 0, "transcrib": 0, "devic": 0, "none": 0, "multilingu": 0, "fals": 0, "languag": 0, "client_uid": 0, "attribut": 0, "rate": 0, "int": 0, "The": 0, "audio": 0, "sampl": 0, "constant": 0, "set": 0, "16000": 0, "server_readi": 0, "str": 0, "A": 0, "messag": 0, "i": 0, "readi": 0, "disconnect": 0, "client": 0, "should": 0, "uniqu": 0, "identifi": 0, "data": 0, "byte": 0, "accumul": 0, "frame": 0, "transcript": 0, "type": 0, "e": 0, "g": 0, "whispermodel": 0, "whisper": [], "model": 0, "speech": 0, "text": 0, "timestamp_offset": 0, "float": 0, "offset": 0, "timestamp": 0, "frames_np": 0, "numpi": 0, "ndarrai": 0, "arrai": 0, "store": 0, "frames_offset": 0, "list": 0, "segment": 0, "current_out": 0, "current": 0, "incomplet": 0, "prev_out": 0, "previou": 0, "t_start": 0, "start": 0, "exit": 0, "bool": 0, "flag": 0, "thread": 0, "same_output_threshold": 0, "threshold": 0, "consecut": 0, "same": 0, "output": 0, "show_prev_out_thresh": 0, "show": 0, "add_pause_thresh": 0, "ad": 0, "paus": 0, "blank": 0, "send_last_n_seg": 0, "number": 0, "last": 0, "send": 0, "wrapper": 0, "textwrap": 0, "textwrapp": 0, "format": 0, "pick_previous_seg": 0, "includ": 0, "connect": 0, "add_fram": 0, "frame_np": 0, "add": 0, "ongo": 0, "stream": 0, "buffer": 0, "thi": 0, "method": 0, "respons": 0, "maintain": 0, "allow": 0, "continu": 0, "addit": 0, "thei": 0, "ar": 0, "receiv": 0, "It": 0, "also": 0, "ensur": 0, "doe": 0, "exce": 0, "specifi": 0, "size": 0, "prevent": 0, "excess": 0, "memori": 0, "usag": 0, "If": 0, "45": 0, "second": 0, "discard": 0, "oldest": 0, "30": 0, "reason": 0, "empti": 0, "initi": 0, "provid": 0, "us": 0, "real": 0, "time": 0, "process": 0, "arg": 0, "cleanup": 0, "perform": 0, "befor": 0, "servic": 0, "necessari": 0, "stop": 0, "mark": 0, "gracefulli": 0, "destroi": 0, "resourc": 0, "associ": 0, "notifi": 0, "via": 0, "them": 0, "fill_output": 0, "combin": 0, "complet": 0, "result": 0, "wrap": 0, "two": 0, "line": 0, "each": 0, "contain": 0, "maximum": 0, "50": 0, "charact": 0, "fit": 0, "within": 0, "per": 0, "concaten": 0, "order": 0, "exist": 0, "most": 0, "recent": 0, "first": 0, "older": 0, "prepend": 0, "need": 0, "limit": 0, "3": 0, "detect": 0, "ani": 0, "preced": 0, "content": 0, "return": 0, "singl": 0, "string": 0, "speech_to_text": 0, "an": 0, "infinit": 0, "loop": 0, "wait": 0, "input": 0, "make": 0, "predict": 0, "util": 0, "asr": 0, "sent": 0, "histori": 0, "context": 0, "from": 0, "handl": 0, "durat": 0, "rais": 0, "except": 0, "issu": 0, "commun": 0, "update_seg": 0, "append": 0, "all": 0, "assum": 0, "updat": 0, "end": 0, "chronolog": 0, "one": 0, "repeat": 0, "seen": 0, "multipl": 0, "onli": 0, "onc": 0, "base": 0, "dict": 0, "dictionari": 0, "chunk": 0, "its": 0, "valid": 0, "transcriptionserv": 0, "repres": 0, "incom": 0, "vad_model": 0, "torch": 0, "modul": 0, "voic": 0, "activ": 0, "vad_threshold": 0, "clients_start_tim": 0, "track": 0, "max_client": 0, "max_connection_tim": 0, "get_wait_tim": 0, "calcul": 0, "estim": 0, "minut": 0, "recv_audio": 0, "over": 0, "vad": 0, "determin": 0, "reach": 0, "statu": 0, "until": 0, "slot": 0, "avail": 0, "clean": 0, "up": 0, "error": 0, "dure": 0, "run": 0, "host": 0, "port": 0, "9090": 0, "address": 0, "bind": 0, "index": 0, "search": 0, "page": 0, "whisper_l": 0, "": 0, "is_multilingu": 0, "lang": 0, "translat": 0, "record": [], "microphon": 0, "plai": [], "file": 0, "while": [], "pyaudio": [], "playback": [], "paint16": [], "16": [], "bit": [], "pcm": [], "channel": [], "1": [], "mono": 0, "hz": [], "record_second": [], "whether": 0, "enabl": [], "select": [], "uid": [], "last_response_reciev": [], "disconnect_if_no_response_for": [], "without": [], "static": [], "bytes_to_float_arrai": [], "audio_byt": [], "convert": [], "normal": [], "have": [], "valu": [], "between": [], "np": [], "close_websocket": [], "close": [], "join": [], "attempt": [], "self": [], "client_socket": [], "after": [], "proper": [], "termin": [], "get_client_socket": [], "get": [], "socket": [], "instanc": 0, "websocketapp": [], "on_messag": [], "w": [], "callback": [], "function": [], "call": [], "when": [], "variou": [], "on_open": [], "successfulli": [], "open": 0, "configur": [], "mode": [], "play_fil": [], "filenam": [], "read": 0, "through": [], "simultan": [], "creat": 0, "point": [], "typic": [], "you": [], "want": [], "pre": [], "path": [], "out_fil": [], "output_record": [], "wav": [], "save": 0, "directori": [], "separ": [], "can": 0, "interrupt": [], "keyboardinterrupt": [], "press": [], "ctrl": [], "c": [], "option": 0, "name": [], "entir": [], "default": 0, "send_packet_to_serv": [], "packet": [], "write_audio_frames_to_fil": [], "file_nam": [], "write": [], "overwritten": [], "correct": [], "match": [], "width": [], "written": [], "which": 0, "write_output_record": [], "n_audio_fil": [], "individu": [], "expect": [], "locat": [], "final": [], "delet": [], "transcriptioncli": 0, "act": 0, "high": 0, "level": 0, "hostnam": 0, "ip": 0, "support": 0, "primari": 0, "english": 0, "en": 0, "requir": 0, "underli": 0, "exampl": 0, "To": 0, "python": 0, "transcription_cli": 0, "localhost": 0, "true": 0, "resampl": 0, "sr": 0, "http": 0, "github": 0, "com": 0, "openai": 0, "blob": 0, "7858aa9c08d98f75575035ecd6481f462d66ca27": 0, "py": 0, "l22": 0, "waveform": 0, "paramet": [], "resampled_fil": 0}, "objects": {"whisper_live": [[0, 0, 0, "-", "client"], [0, 0, 0, "-", "server"]], "whisper_live.client": [[0, 1, 1, "", "TranscriptionClient"], [0, 2, 1, "", "resample"]], "whisper_live.server": [[0, 1, 1, "", "ServeClient"], [0, 1, 1, "", "TranscriptionServer"]], "whisper_live.server.ServeClient": [[0, 3, 1, "", "add_frames"], [0, 3, 1, "", "cleanup"], [0, 3, 1, "", "disconnect"], [0, 3, 1, "", "fill_output"], [0, 3, 1, "", "speech_to_text"], [0, 3, 1, "", "update_segments"]], "whisper_live.server.TranscriptionServer": [[0, 3, 1, "", "get_wait_time"], [0, 3, 1, "", "recv_audio"], [0, 3, 1, "", "run"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:function", "3": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "function", "Python function"], "3": ["py", "method", "Python method"]}, "titleterms": {"welcom": 0, "whisper_l": [], "": [], "document": 0, "indic": 0, "tabl": 0, "whisper": 0, "live": 0}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Welcome to Whisper Live documentation!": [[0, "welcome-to-whisper-live-documentation"]], "Indices and tables": [[0, "indices-and-tables"]]}, "indexentries": {"serveclient (class in whisper_live.server)": [[0, "whisper_live.server.ServeClient"]], "transcriptionclient (class in whisper_live.client)": [[0, "whisper_live.client.TranscriptionClient"]], "transcriptionserver (class in whisper_live.server)": [[0, "whisper_live.server.TranscriptionServer"]], "add_frames() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.add_frames"]], "cleanup() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.cleanup"]], "disconnect() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.disconnect"]], "fill_output() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.fill_output"]], "get_wait_time() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.get_wait_time"]], "module": [[0, "module-whisper_live.client"], [0, "module-whisper_live.server"]], "recv_audio() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.recv_audio"]], "resample() (in module whisper_live.client)": [[0, "whisper_live.client.resample"]], "run() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.run"]], "speech_to_text() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.speech_to_text"]], "update_segments() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.update_segments"]], "whisper_live.client": [[0, "module-whisper_live.client"]], "whisper_live.server": [[0, "module-whisper_live.server"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["Welcome to Whisper Live documentation!"], "terms": {"class": 0, "whisper_l": 0, "server": 0, "servecli": 0, "websocket": 0, "task": 0, "transcrib": 0, "devic": 0, "none": 0, "multilingu": 0, "fals": 0, "languag": 0, "client_uid": 0, "attribut": 0, "rate": 0, "int": 0, "The": 0, "audio": 0, "sampl": 0, "constant": 0, "set": 0, "16000": 0, "server_readi": 0, "str": 0, "A": 0, "messag": 0, "i": 0, "readi": 0, "disconnect": 0, "client": 0, "should": 0, "uniqu": 0, "identifi": 0, "data": 0, "byte": 0, "accumul": 0, "frame": 0, "transcript": 0, "type": 0, "e": 0, "g": 0, "whispermodel": 0, "model": 0, "speech": 0, "text": 0, "timestamp_offset": 0, "float": 0, "offset": 0, "timestamp": 0, "frames_np": 0, "numpi": 0, "ndarrai": 0, "arrai": 0, "store": 0, "frames_offset": 0, "list": 0, "segment": 0, "current_out": 0, "current": 0, "incomplet": 0, "prev_out": 0, "previou": 0, "t_start": 0, "start": 0, "exit": 0, "bool": 0, "flag": 0, "thread": 0, "same_output_threshold": 0, "threshold": 0, "consecut": 0, "same": 0, "output": 0, "show_prev_out_thresh": 0, "show": 0, "add_pause_thresh": 0, "ad": 0, "paus": 0, "blank": 0, "send_last_n_seg": 0, "number": 0, "last": 0, "send": 0, "wrapper": 0, "textwrap": 0, "textwrapp": 0, "format": 0, "pick_previous_seg": 0, "includ": 0, "connect": 0, "add_fram": 0, "frame_np": 0, "add": 0, "ongo": 0, "stream": 0, "buffer": 0, "thi": 0, "method": 0, "respons": 0, "maintain": 0, "allow": 0, "continu": 0, "addit": 0, "thei": 0, "ar": 0, "receiv": 0, "It": 0, "also": 0, "ensur": 0, "doe": 0, "exce": 0, "specifi": 0, "size": 0, "prevent": 0, "excess": 0, "memori": 0, "usag": 0, "If": 0, "45": 0, "second": 0, "discard": 0, "oldest": 0, "30": 0, "reason": 0, "empti": 0, "initi": 0, "provid": 0, "us": 0, "real": 0, "time": 0, "process": 0, "arg": 0, "cleanup": 0, "perform": 0, "befor": 0, "servic": 0, "necessari": 0, "stop": 0, "mark": 0, "gracefulli": 0, "destroi": 0, "resourc": 0, "associ": 0, "notifi": 0, "via": 0, "them": 0, "fill_output": 0, "combin": 0, "complet": 0, "result": 0, "wrap": 0, "two": 0, "line": 0, "each": 0, "contain": 0, "maximum": 0, "50": 0, "charact": 0, "fit": 0, "within": 0, "per": 0, "concaten": 0, "order": 0, "exist": 0, "most": 0, "recent": 0, "first": 0, "older": 0, "prepend": 0, "need": 0, "limit": 0, "3": 0, "detect": 0, "ani": 0, "preced": 0, "content": 0, "return": 0, "singl": 0, "string": 0, "speech_to_text": 0, "an": 0, "infinit": 0, "loop": 0, "": 0, "wait": 0, "input": 0, "make": 0, "predict": 0, "util": 0, "asr": 0, "sent": 0, "histori": 0, "context": 0, "from": 0, "handl": 0, "durat": 0, "rais": 0, "except": 0, "issu": 0, "commun": 0, "update_seg": 0, "append": 0, "all": 0, "assum": 0, "updat": 0, "end": 0, "chronolog": 0, "one": 0, "repeat": 0, "seen": 0, "multipl": 0, "onli": 0, "onc": 0, "base": 0, "dict": 0, "dictionari": 0, "chunk": 0, "its": 0, "valid": 0, "transcriptionserv": 0, "repres": 0, "incom": 0, "vad_model": 0, "torch": 0, "modul": 0, "voic": 0, "activ": 0, "vad_threshold": 0, "clients_start_tim": 0, "track": 0, "max_client": 0, "max_connection_tim": 0, "get_wait_tim": 0, "calcul": 0, "estim": 0, "minut": 0, "recv_audio": 0, "over": 0, "vad": 0, "determin": 0, "reach": 0, "statu": 0, "until": 0, "slot": 0, "avail": 0, "clean": 0, "up": 0, "error": 0, "dure": 0, "run": 0, "host": 0, "port": 0, "9090": 0, "address": 0, "bind": 0, "transcriptioncli": 0, "is_multilingu": 0, "lang": 0, "translat": 0, "act": 0, "high": 0, "level": 0, "can": 0, "hostnam": 0, "ip": 0, "option": 0, "whether": 0, "support": 0, "default": 0, "primari": 0, "which": 0, "english": 0, "en": 0, "requir": 0, "instanc": 0, "underli": 0, "exampl": 0, "To": 0, "creat": 0, "microphon": 0, "python": 0, "transcription_cli": 0, "localhost": 0, "true": 0, "resampl": 0, "file": 0, "sr": 0, "http": 0, "github": 0, "com": 0, "openai": 0, "blob": 0, "7858aa9c08d98f75575035ecd6481f462d66ca27": 0, "py": 0, "l22": 0, "open": 0, "read": 0, "mono": 0, "waveform": 0, "save": 0, "resampled_fil": 0, "index": 0, "search": 0, "page": 0, "record": 0, "static": 0, "bytes_to_float_arrai": 0, "audio_byt": 0, "convert": 0, "16": 0, "bit": 0, "pcm": 0, "normal": 0, "have": 0, "valu": 0, "between": 0, "1": 0, "np": 0, "close_websocket": 0, "close": 0, "join": 0, "attempt": 0, "self": 0, "client_socket": 0, "after": 0, "proper": 0, "termin": 0, "get_client_socket": 0, "get": 0, "socket": 0, "websocketapp": 0, "on_messag": 0, "w": 0, "callback": 0, "function": 0, "call": 0, "when": 0, "variou": 0, "on_open": 0, "successfulli": 0, "configur": 0, "uid": 0, "mode": 0, "select": 0, "play_fil": 0, "filenam": 0, "plai": 0, "through": 0, "simultan": 0, "pyaudio": 0, "playback": 0, "point": 0, "typic": 0, "you": 0, "want": 0, "pre": 0, "path": 0, "out_fil": 0, "output_record": 0, "wav": 0, "record_second": 0, "directori": 0, "separ": 0, "interrupt": 0, "keyboardinterrupt": 0, "press": 0, "ctrl": 0, "c": 0, "name": 0, "entir": 0, "send_packet_to_serv": 0, "packet": 0, "write_audio_frames_to_fil": 0, "file_nam": 0, "write": 0, "overwritten": 0, "correct": 0, "match": 0, "channel": 0, "width": 0, "written": 0, "write_output_record": 0, "n_audio_fil": 0, "individu": 0, "expect": 0, "locat": 0, "final": 0, "delet": 0}, "objects": {"whisper_live": [[0, 0, 0, "-", "client"], [0, 0, 0, "-", "server"]], "whisper_live.client": [[0, 1, 1, "", "Client"], [0, 1, 1, "", "TranscriptionClient"], [0, 3, 1, "", "resample"]], "whisper_live.client.Client": [[0, 2, 1, "", "bytes_to_float_array"], [0, 2, 1, "", "close_websocket"], [0, 2, 1, "", "get_client_socket"], [0, 2, 1, "", "on_message"], [0, 2, 1, "", "on_open"], [0, 2, 1, "", "play_file"], [0, 2, 1, "", "record"], [0, 2, 1, "", "send_packet_to_server"], [0, 2, 1, "", "write_audio_frames_to_file"], [0, 2, 1, "", "write_output_recording"]], "whisper_live.server": [[0, 1, 1, "", "ServeClient"], [0, 1, 1, "", "TranscriptionServer"]], "whisper_live.server.ServeClient": [[0, 2, 1, "", "add_frames"], [0, 2, 1, "", "cleanup"], [0, 2, 1, "", "disconnect"], [0, 2, 1, "", "fill_output"], [0, 2, 1, "", "speech_to_text"], [0, 2, 1, "", "update_segments"]], "whisper_live.server.TranscriptionServer": [[0, 2, 1, "", "get_wait_time"], [0, 2, 1, "", "recv_audio"], [0, 2, 1, "", "run"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"welcom": 0, "whisper": 0, "live": 0, "document": 0, "indic": 0, "tabl": 0}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Welcome to Whisper Live documentation!": [[0, "welcome-to-whisper-live-documentation"]], "Indices and tables": [[0, "indices-and-tables"]]}, "indexentries": {"client (class in whisper_live.client)": [[0, "whisper_live.client.Client"]], "serveclient (class in whisper_live.server)": [[0, "whisper_live.server.ServeClient"]], "transcriptionclient (class in whisper_live.client)": [[0, "whisper_live.client.TranscriptionClient"]], "transcriptionserver (class in whisper_live.server)": [[0, "whisper_live.server.TranscriptionServer"]], "add_frames() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.add_frames"]], "bytes_to_float_array() (whisper_live.client.client static method)": [[0, "whisper_live.client.Client.bytes_to_float_array"]], "cleanup() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.cleanup"]], "close_websocket() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.close_websocket"]], "disconnect() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.disconnect"]], "fill_output() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.fill_output"]], "get_client_socket() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.get_client_socket"]], "get_wait_time() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.get_wait_time"]], "module": [[0, "module-whisper_live.client"], [0, "module-whisper_live.server"]], "on_message() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.on_message"]], "on_open() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.on_open"]], "play_file() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.play_file"]], "record() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.record"]], "recv_audio() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.recv_audio"]], "resample() (in module whisper_live.client)": [[0, "whisper_live.client.resample"]], "run() (whisper_live.server.transcriptionserver method)": [[0, "whisper_live.server.TranscriptionServer.run"]], "send_packet_to_server() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.send_packet_to_server"]], "speech_to_text() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.speech_to_text"]], "update_segments() (whisper_live.server.serveclient method)": [[0, "whisper_live.server.ServeClient.update_segments"]], "whisper_live.client": [[0, "module-whisper_live.client"]], "whisper_live.server": [[0, "module-whisper_live.server"]], "write_audio_frames_to_file() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.write_audio_frames_to_file"]], "write_output_recording() (whisper_live.client.client method)": [[0, "whisper_live.client.Client.write_output_recording"]]}}) \ No newline at end of file diff --git a/whisper_live/client.py b/whisper_live/client.py index 7364c24..ca2300c 100644 --- a/whisper_live/client.py +++ b/whisper_live/client.py @@ -44,6 +44,9 @@ def resample(file: str, sr: int = 16000): class Client: + """ + Handles audio recording, streaming, and communication with a server using WebSocket. + """ INSTANCES = {} def __init__(