This commit is contained in:
Doug Le Tough 2019-08-26 06:29:58 +11:00
parent 8803047980
commit eb91e1f684
2 changed files with 99 additions and 1 deletions

View File

@ -1,3 +1,26 @@
# logstreamer
LogStreamer est un logiciel permettant la diffusion sonore d'un fichier via un serveur Icecast
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```

75
logstreamer.py Executable file
View File

@ -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))