File size: 3,665 Bytes
ebaaf9b
abaf442
d7b2452
abaf442
ebaaf9b
f1bf1b3
a94388a
ebaaf9b
 
f4a3257
 
 
d7b2452
f4a3257
d7b2452
 
f4a3257
d7b2452
 
 
 
f4a3257
d7b2452
 
 
 
 
 
 
f4a3257
d7b2452
 
 
 
 
 
 
 
 
 
 
 
 
f4a3257
 
 
 
d7b2452
f4a3257
 
 
 
 
abaf442
55b37bf
 
 
 
 
 
 
 
 
 
 
f4a3257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b85baaf
 
 
5a62402
f4a3257
 
 
 
 
a9516a4
 
f4a3257
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import asyncio
import json
import wave

import websockets
import requests
import ssl

# Parameters for reading and sending the audio
AUDIO_FILE_URL = "https://raw.githubusercontent.com/AshDavid12/runpod-serverless-forked/main/test_hebrew.wav"  # Use WAV file

async def send_audio(websocket):
    buffer_size = 1024 * 16  # Send smaller chunks (16KB) for real-time processing

    # Download the WAV file locally
    with requests.get(AUDIO_FILE_URL, stream=True) as response:
        if response.status_code == 200:
            with open('downloaded_audio.wav', 'wb') as f:
                for chunk in response.iter_content(chunk_size=1024):
                    f.write(chunk)
            print("Audio file downloaded successfully.")

            # Open the downloaded WAV file and extract PCM data
            with wave.open('downloaded_audio.wav', 'rb') as wav_file:
                metadata = {
                    'sample_rate': wav_file.getframerate(),
                    'channels': wav_file.getnchannels(),
                    'sampwidth': wav_file.getsampwidth(),
                }

                # Send metadata to the server before sending the audio
                await websocket.send(json.dumps(metadata))
                print(f"Sent metadata: {metadata}")

                # Send the PCM audio data in chunks
                while True:
                    pcm_chunk = wav_file.readframes(buffer_size)
                    if not pcm_chunk:
                        break  # End of file

                    await websocket.send(pcm_chunk)  # Send raw PCM data chunk
                    print(f"Sent PCM chunk of size {len(pcm_chunk)} bytes.")
                    await asyncio.sleep(0.01)  # Simulate real-time sending

        else:
            print(f"Failed to download audio file. Status code: {response.status_code}")


async def receive_transcription(websocket):
    while True:
        try:
            transcription = await websocket.recv()  # Receive transcription from the server
            print(f"Transcription: {transcription}")
            transcription = json.loads(transcription)
            download_url = transcription.get('download_url')
            if download_url:
                print(f"Download URL: {download_url}")
                # Download the audio file
                response = requests.get(download_url)
                if response.status_code == 200:
                    with open("downloaded_audio.wav", "wb") as f:
                        f.write(response.content)
                    print("File downloaded successfully")
                else:
                    print(f"Failed to download file. Status code: {response.status_code}")
        except Exception as e:
            print(f"Error receiving transcription: {e}")
            break

async def send_heartbeat(websocket):
    while True:
        try:
            await websocket.ping()
            print("Sent keepalive ping")
        except websockets.ConnectionClosed:
            print("Connection closed, stopping heartbeat")
            break
        await asyncio.sleep(30)  # Send ping every 30 seconds (adjust as needed)


async def run_client():
    uri = ("wss://gigaverse-ivrit-ai-streaming.hf.space/wtranscribe")  # WebSocket URL
    ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE

    async with websockets.connect(uri, ssl=ssl_context, timeout=60) as websocket:
        await asyncio.gather(
            send_audio(websocket),
            receive_transcription(websocket),
            send_heartbeat(websocket)
        )

asyncio.run(run_client())