Files
AS-S-2-Speech/ASS_Text_2_Speech.py
2025-07-10 12:36:41 +01:00

85 lines
3.4 KiB
Python

import os
import time
import configparser
from datetime import datetime
import pygame
import socket
import threading
# Initialize pygame mixer
pygame.mixer.init()
# Dictionary to map phrases to their corresponding sound files
phrase_to_sound = {
"NORMAL SERVE OUT": "servebeep.wav",
"CLOSE OUT": "rallybeepclose.wav",
"SUPER OUT": "rallybeep.wav",
"NORMAL OUT": "rallybeep.wav",
"CLOSE SERVE OUT": "servebeep.wav",
"SUPER SERVE OUT": "servebeepclose.wav"
}
# Function to check if a line contains any of the specified phrases
def check_line(line):
for phrase in phrase_to_sound.keys():
if phrase in line:
return phrase
return None
# Function to read configuration from the INI file
def read_config():
config = configparser.ConfigParser()
config.read("config.ini")
log_file_path = config.get("Settings", "LogFile")
court_name = config.get("Settings", "CourtName")
footfault_file_path = config.get("Settings", "Footfault")
IP_Relay = config.get("Settings", "IP")
CommandON = config.get("Settings", "CommandON")
CommandOFF = config.get("Settings", "CommandOFF")
return log_file_path, court_name, footfault_file_path, IP_Relay, CommandON, CommandOFF
# Function to send the CommandOFF signal after a delay
def send_command_off(IP_Relay, CommandOFF):
time.sleep(3)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.sendto(bytes.fromhex(CommandOFF), (IP_Relay, 8761))
# Function to monitor a log file
def monitor_log_file(log_file_path, court_name, IP_Relay, CommandON, CommandOFF, footfault=False):
with open(log_file_path, "r") as file:
# Move the pointer to the end of the file
file.seek(0, os.SEEK_END)
while True:
new_line = file.readline()
if new_line:
if footfault:
print(f"Footfault detected at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.sendto(bytes.fromhex(CommandON), (IP_Relay, 8761))
pygame.mixer.music.load("FootFault4.wav")
pygame.mixer.music.play()
# Start a new thread to send the CommandOFF after 3 seconds
threading.Thread(target=send_command_off, args=(IP_Relay, CommandOFF)).start()
else:
result = check_line(new_line)
if result:
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{current_time}] {court_name}: {result}")
# Play the corresponding sound file
pygame.mixer.music.load(phrase_to_sound[result])
pygame.mixer.music.play()
time.sleep(0.1) # Adjust the sleep time as needed
# Main loop to monitor the log files
log_file_path, court_name, footfault_file_path, IP_Relay, CommandON, CommandOFF = read_config()
# Create a new thread for each log file monitoring
# Thread for the main log file
main_thread = threading.Thread(target=monitor_log_file, args=(log_file_path, court_name, IP_Relay, CommandON, CommandOFF))
main_thread.start()
# Thread for the footfault log file
footfault_thread = threading.Thread(target=monitor_log_file, args=(footfault_file_path, court_name, IP_Relay, CommandON, CommandOFF, True))
footfault_thread.start()