Manual:Grupo de trabajo Sonido

De Hackmeeting

manual # índice # Documentación # FAQ local

Grupo de Sonido


Se encarga de coordinar y montar los equipos de sonido.


Amplificar la voz y el audio de la sala


Para eso vamos a necesitar (por cada sala a no ser que no se hagan simultáneamente y sea posible mover el equipo de sala a sala):

  • Un micrófono dinámico por ponente, con su correspondiente pie de mesa o suelo y cable.
  • Una mesa de mezclas con entrada de micro y entrada de línea, cómo mínimo.
  • Un sistema de amplificación que puede ser:
    • Pareja de monitores autoamplificados.
    • Un amplificador mas dos pantallas pasivas.

Cableado necesario:

    • RCA-RCA
    • Canon-Canon (XLR-XLR)
    • Canon(XLR)-Jack y viceversa (macho-hembra hembra-macho, nunca se sabe cuando puedes necesitarlo)
    • Adaptadores varios: de jack pequeño a grande y viceversa, de jack RCA y viceversa, Canon(XLR)-RCA, etc.


Registrarlo y mandar una señal para el streaming


Registro:

  • Se puede utilizar un ordenador conectado a la mesa o a una salida auxiliar del amplificador (asegurarse de que no está amplificada la salida, de lo contrario habrá distorsión), y grabarlo con cualquier aplicación libre ;)
  • También sirve, cómo no un grabador Minidisk con entrada line-in
  • O un reproductor ogg con line-in


Equipo para el chillout y el escenario


El equipo del chillout normalmente no es muy potente, suele bastar un equipo de hi-fi doméstico. El equipo del escenario (si lo hubiera, claro) ya suele ser más grande, dependiendo de las necesidades y de las posibilidades de conseguirlo. En todo caso, suele ser un equipo que ya consta de su etapa de potencia conectado a su P.A., mesa de directo o de DJ, sus platos si hay que pinchar, etc. Aunque si no se dispone de medios siempre se puede improvisar con el equipo de la ponencia y un mp3 portátil ;)


Cómo grabar a través de ordenador


La grabación de las charlas durante el hackInvisible (2008) se realizó poniendo un ordenador en cada sala de charlas conectado a la mesa de sonido. Estos ordenadores tenían un sistema preparado por el hackmeeting. Cada ordenador disponía de una Debian (se podría utilizar cualquier otra distribución de GNU/Linux) sin entorno gráfico, con los programas ecasound, lltag, ssh-client y alsa-utils instalados.

En la primera consola (Ctrl-Alt-F1) estaba en ejecución un script de shell (graba.sh) que daba instrucciones al usuario, grababa y tageaba las charlas. Además al terminar cada grabación subía automáticamente las grabaciones a un servidor donde se almacenaban. Para poder subir las charlas el servidor tenía incluidas la clave publica ssh de cada uno de los ordenadores de grabación, con lo que se autentificaban a través de ella.

En la segunda consola (Ctrl-Alt-F2) estaba en ejecución otro script de shell (monitor.sh) que mostraba monitores de volumen de las grabaciones para poder ajustar que se estén grabando bien las charlas.

En la tercera consola (Ctrl-Alt-F3) estaba en ejecución un tercer script (alsamixer.sh) que mantenía todo el rato en ejecución alsamixer, con el que se regulan los volúmenes de grabación.

Además de estos tres scripts se creó un cuarto script (comprueba_charlas.sh) que ejecutábamos manualmente, que permitía comprobar la integridad de las charlas enviadas al servidor. Con el se verificaba que cada charla hubiera llegado íntegramente al servidor y se había visto dañada por problemas con la red.

Scripts

Todo el código mostrado en esta sección esta bajo la licencia GPLv3[1].

graba_z.sh

Este script utiliza la aplicación gráfica zenity como interfaz con el usuario y se ha usado en el HM 2009

#!/bin/bash

usage(){ cat << EOU >&2
    $0 - Script para la grabación de charlas del hackmeeting
    Uso: $0 [-s SALA] [-g GENERO] [-a ALBUM] [-c COMENTARIO] -p [PATH] [-r user@host:sharepoint] [-f ARCHIVO_DE_CHARLAS]
        -s SALA     Sala de la charla
        -g GENERO   Genero para las tags del archivo de audio
        -a ALBUM    Albug para las tags del archivo de audio
        -c COMENT   Comentario para las tags de archivo de audio
        -r REMOTE   Direccion a la que hacer el SCP del archivo al finalizar
        -f FILE     Archivo que contiene la relacion de charlas previstas, en formato "CHARLA | PONENTE"
        -p PATH     Path por defecto donde se guardaran los archivos
EOU
exit
}
debug(){ echo $@ >&2; }
_stop(){ zenity --question --title "Dialogo de confirmacion de cierre" --text="¿Esta seguro que quiere detener la grabacion?" && { pkill arecord; exit; }; }
restart_on_exit(){ (( $1 > 0 )) && { continue; }; }

main_loop(){
    debug "[INFO] Starting main loop at $( date )"
    # Me parecia un poco cargante...
    #zenity --info --title="Preparado para iniciar una grabacion"\
    #    --text="Presta atencion a las siguientes preguntas"

    # Los nombre de la charla se toman de $charlas_file
    Charla=`cat ${charlas_file}|tr '|' '\n'| zenity --list --width="600" --height="400" \
          --title="Elija la charla que quiere grabar" \
          --text="Elija la charla de la lista inferior"\
          --print-column=ALL  \
          --column="Charla" $charlas --column="Ponente"`
    restart_on_exit $?

    IFS="|"; while read nc np; do
        nombre_charla="${nc}"; nombre_ponente="${np}";
        nf_charla=$( tr -d ' ' <<< "$nombre_charla");
    done <<< "${Charla}"

    debug "[Info] Asking for user confirmation on selecting $nombre_charla"
    zenity --question \
          --title="Datos para la grabacion" \
          --ok-label="Continuar" --cancel-label="Seleccionar otra"\
          --text="<b>Charla:</b> $nombre_charla\n<b>Ponente:</b> $nombre_ponente"
    restart_on_exit $?

    # Nombre de fichero con el path, nombre charla, fecha y sala
    filename="${path}${nf_charla}_$(date +%d-%H_%M)_${sala}.ogg"

    debug "[INFO] [$filename] Starting record for $filename"
    # Grabamos charla con arecord y encodeamos con oggenc
    arecord -f cd -t raw | oggenc - -r -o $filename &

    # Preguntamos periodicamente si el usuario quiere terminar la grabacion.
    # NOTA: Esto puede ser un poco desesperante...
    while true; do
        debug "[INFO] [$filename] Asking user to stop or continue."
        espacio_libre=`df -h $path | awk 'END {print $(NF-2)}'`
        ocupa_file=( $(du -h $filename ) ) # Lo sacamos con du, y asignamos a un array. 
                                           # Al imprimirlo como si fuera una variable nos dara solo el primer elemento, tamaño.

        zenity --question --title="Grabando..."\
            --ok-label="Detener" --cancel-label="Continuar"\
            --text="<b>Espacio libre:</b>  $espacio_libre\n<b>Tamano fichero:</b> $ocupa_file\n"\
            --timeout=10 && _stop
    done

    debug "[INFO] [$filename] Etiquetting $filename with $nombre_charla, $album, $genero, $comentario"
    # Ponemos etiquetas el fichero ogg
    lltag --yes -a "$nombre_ponente" -t "$nombre_charla" -A "$album" -g "$genero" -c "$comentario" -d "`date -R`" $filename

    # Copiamos el fichero al servidor de CEB
    debug "[INFO] [$filename] [`date -R`] Copiando fichero ${filename} al servidor CEB."
    scp $filename $remote 2>&1
}

# Usage note: it will set defaults, override them on ~/.grabacion_charlas.cfg, override this with ./grabacion_charlas.cfg and then override that with arguments ;)

# Set defaults.
    sala="SALA_1"
    genero="hacktivismo"
    album="hackmeeting09"
    comentario="http://sindominio.net/hackmeeting"
    path="$HOME/charlas/"
    remote="isaac@ceb:/mnt/farre/CompartirEsBueno/sube/hackmeeting/"
    charlas_file="./charlas.txt";

# Source conf file
    [[ -e ~/.grabacion_charlas.cfg ]] && . ~/.grabacion_charlas.cfg
    [[ -e grabacion_charlas.cfg ]] && . grabacion_charlas.cfg

# Get arguments
    while getopts "s:g:a:c:r:f:p:h" opt; do
        case $opt in
            s) sala="$OPTARG" ;;
            g) genero="$OPTARG" ;;
            a) album="$OPTARG" ;;
            c) comentario="$OPTARG" ;;
            r) remote="$OPTARG" ;;
            f) charlas_file="$OPTARG" ;;
            p) path="$OPTARG" ;;
            h) usage ;;
            [?]) usage ;;
        esac
    done
[[ ! -e $path ]] && mkdir -p $path;
while true; do main_loop 2>>$path/graba.log; done

Nota de XayOn: Al refactorizar este script he metido cosas en inglés y spanglish, la costumbre, si alguien lo quiere traducir por mi... Hay cosas utiles que se podrian aplicar al script sin interfáz, pero para eso igual haría spam de unas librerias en bash que tengo por ahi pa coloricos y menus varios.

graba.sh

#!/bin/bash
# Nice colorize functions got from jabashit http://github.com/XayOn/jabashit
declare -A colors highlights
highlights=([standout]=0 [underline]=1 [reverse]=2 [blink]=3 [dim]=4 [bold]=5 [invis]=6 [protect]=7 [altcharset]=8 )
colors=( [none]=0 [black]=1 [blue]=2 [green]=3 [cyan]=4 [magenta]=5 [yellow]=6 [white]=7 )
split(){ echo $1|tr $2 " "; }
get_color(){ [[ $1 < 254 ]] && { echo $1; } || { echo ${colors[$1]} ; } ; }
colorize(){ a=($(split $1 ",")); fg=$(get_color ${a[1]});  bg=$(get_color ${a[2]}); ef=${a[0]}; [[ $bg ]] && tput setab $bg; [[ ${fg} ]] && tput setaf $fg ; [[ ${ef} != "0" ]] && tput $ef; echo -en "$2"; tput sgr0; }
get_center(){ [[ $2 ]] && echo $(( ( $1 - $2 ) / 2 )) || echo $(( $1 / 2 )); }
center(){ message=$1; tput cuf $(get_center `tput cols` ${#message}); echo $1; }
mkline(){ for i in $( seq 0 $(( $(tput cols) - 1 ))); do echo -en $1; done; echo; }
# end of jabashit functions

get_charla_data(){
    tput bold; center "$(colorize blink,black,red "Graba-O-Matic")"; mkline "="
    center "$(colorize bold,black,red "NO ESTAS GRABANDO AUN")"; mkline "+"; echo
    center "$(colorize bold,black,red $album)"; echo
    echo -e "Esta grabacion no tiene ninguna garantia para ningun proposito y las ideologas de la cosa delegan toda responsabilidad sobre  el  padrino de la charla.\nWith great power comes great responsibility\n\n";
    read -p "$(colorize bold,100,0 "Nombre de la charla: ")" nombre_charla
    read -p "$(colorize bold,100,0 "Nombre del ponente: ")" nombre_ponente
}

main_loop(){ clear;
    center "$(colorize "0,0,120" "Preparado para grabar la charla\n")"; mkline ".";
    colorize "bold,100,0" "\n\t---> ALT-F1 : volver aqui\n"
    colorize "bold,100,0" "\t---> ALT-F2 : monitorizar volumen\n"
    colorize "bold,100,0" "\t---> ALT-F3 : modificar volumen\n\n"
    center "Importante: Manten el volumen en rango medio\n\n"
    echo -e "===> Enter : Empezar a grabar"
    echo -e "===> Ctrl-C : Terminar y enviar"
    read

    filename=$path`date +%d-%H_%M`_${sala}.ogg
    center $(colorize "bold,0,32" "GRABANDO"); mkline "="
    type ecasound &>/dev/null && ecasound -d:0 -i alsa -o $filename || { echo "Ecasound not installed, install it and try again"; exit; }
    echo -e "\n\nParando... espere por favor."
    lltag --yes -a "$nombre_ponente" -t "$nombre_charla" -A "$album" -g "$genero" -c "$comentario" -d "`date -R`" $filename
    scp $filename $remote &> $path/graba.log && {
        clear
        echo -e "\033[1m\033[33mGracias por su ayuda. Que el espiritu de root vaya contigo."
        echo -e "\n \n **** GRABACION GRABADA Y ENVIADA CON EXITO AL CENTRO DE MEDIAS **** \n \n \n \n \n"
        echo -e "======>          PULSA ENTER PARA LA SIGUIENTE GRABACION       <======\033[37m\033[22m"
        read
        exit;
    } || { echo "Ha habido un error al enviar al centro de medias! Por favor, revisa esto manualmente o pide ayuda"; read -p "Pulse enter para ver el log, ctrl+c para salir"; less $path/ exit; }
}

# Set defaults.
    sala="SALA_1"
    genero="hacktivismo"
    album="hackmeeting09"
    comentario="http://sindominio.net/hackmeeting"
    path="$HOME/charlas/"
    remote="isaac@ceb:/mnt/farre/CompartirEsBueno/sube/hackmeeting/"
    charlas_file="./charlas.txt";

# Source conf file
    [[ -e ~/.grabacion_charlas.cfg ]] && . ~/.grabacion_charlas.cfg
    [[ -e grabacion_charlas.cfg ]] && . grabacion_charlas.cfg

# Get arguments
    while getopts "s:g:a:c:r:f:p:h" opt; do
        case $opt in
            s) sala="$OPTARG" ;;
            g) genero="$OPTARG" ;;
            a) album="$OPTARG" ;;
            c) comentario="$OPTARG" ;;
            r) remote="$OPTARG" ;;
            f) charlas_file="$OPTARG" ;;
            p) path="$OPTARG" ;;
            h) usage ;;
            [?]) usage ;;
        esac
    done
[[ ! -e $path ]] && mkdir -p $path;
get_charla_data; while true; do main_loop 2>>$path/graba.log; done

monitor.sh

#!/bin/sh
while [ 1 ]; do sleep 1; pgrep ecasound &>/dev/null && ecasignalview alsa,default alsa,default || { clear; echo "Ahora no me apetece..."; }; done

alsamixer.sh

#!/bin/sh
while [ 1 ]; do alsamixer -V playback; done

comprueba_charlas.sh

#!/bin/bash -x
cd /home/hm/charlas;
for i in *.ogg; do 
    remote_md5=( $(ssh mediacenter@ceb md5sum $i ) ); local_md5=( $(md5sum $i) )
    [[ "$remote_md5" != "$local_md5" ]] && scp $i mediacenter@ceb:
done
cd - 

wiki-navigation
project-navigation