diff --git a/README.md b/README.md index 4846593..dd93cb1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,26 @@ # logstreamer -LogStreamer est un logiciel permettant la diffusion sonore d'un fichier via un serveur Icecast \ No newline at end of file +LogStreamer est un logiciel permettant la diffusion sonore d'un fichier via un serveur Icecast + + +## Prérequis + +* python3 +* pigtail +``` +pip3 install pigtail +``` + +## Utilisation + +* Ajuster les valeurs des constantes LOG et WAV_OUTPUT en fonction des besoins + * LOG: Le log à jouer + * WAV_OUTPUT: Le fichier wav de sortie + * MAX_DURATION: La durée maximale d'une note + * EXCLUDE: Les caractères dont les valeurs sont ajoutées à cette liste ne seront pas traités +* Exécuter ```python3 logstreamer.py``` +* Lire le fichier wav résultant avec un lecteur audio supportant le format wav + +## TODO + +* Gérer la diffusion vers un serveur Icecast avec ```python-shout``` diff --git a/logstreamer.py b/logstreamer.py new file mode 100755 index 0000000..77dea44 --- /dev/null +++ b/logstreamer.py @@ -0,0 +1,75 @@ +#!/bin/env python3 + +""" +# Prérequis + +* python3 +* pigtail +``` +pip3 install pigtail +``` + +# Utilisation + +* Ajuster les valeurs des constantes LOG et WAV_OUTPUT en fonction des besoins + * LOG: Le log à jouer + * WAV_OUTPUT: Le fichier wav de sortie + * MAX_DURATION: La durée maximale d'une note + * EXCLUDE: Les caractères dont les valeurs sont ajoutées à cette liste ne seront pas traités +* Exécuter python3 text2wav.py +* Lire le fichier wav résultant avec un lecteur audio supportant le format wav + +""" +import wave +import math +import struct +import random +from pygtail import Pygtail + +LOG = '/var/log/httpd/access_log' +WAV_OUTPUT = '/home/doug/test/test.wav' +MAX_DURATION = 0.08 +EXCLUDE = [] + +def sine_wave(frequency=444, framerate=44100, amplitude=0.5, duration=1): + """ + frequency: La fréquence à échantillonner + framerate: Le taux d'échantillonnage + amplitude: Le volume sonore (de 0 à 1) + duration: La durée de l'échantillon en seconde + """ + amplitude = amplitude * 32767 + if amplitude > 32767: + amplitude = 32767 + elif amplitude < 0: + amplitude = 0 + + data = [] + for i in range(int(duration * framerate)): + value = int(amplitude*math.cos(2*frequency*math.pi*float(i)/float(framerate))) + data.append(value) + return struct.pack('<{}h'.format(len(data)), *data) + +def notes_table(oord): + freq = math.floor(math.log(oord)*5000-20000) + duration = MAX_DURATION + return (freq, duration) + +with wave.open(WAV_OUTPUT, 'wb') as wave_file: + nchannels = 1 + sampwidth = 2 + framerate = 44100 + wave_file.setnchannels(nchannels) + wave_file.setsampwidth(sampwidth) + wave_file.setframerate(framerate) + + try: + for line in Pygtail(LOG): + for letter in line: + oord = ord(letter) + freq, duration = notes_table(oord) + if oord not in EXCLUDE: + print("Caractère: {} | Ord: {} | Fréquence: {} | Durée: {}".format(letter, oord, freq, duration)) + wave_file.writeframes(sine_wave(frequency=freq, duration=duration)) + except Exception as e: + print('\033[91m{}\033[0m'.format(e))