seitan666
Age :
Join date : 2008-11-26
Posts : 203
Location :
|
Subject: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:23 pm |
|
|
Vediamo se c'è qualche geek/nerd che può aiutarmi in questo dilemma più o meno irrisolvibile... NOTA: invertire uno dei due canali e convertire la traccia in mono non è un metodo valido... anzi fa caccare... |
|
PsycoYack
Age :
Join date : 2008-11-26
Posts : 267
Location :
|
Subject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:37 pm |
|
|
io te l'ho detto, se tu sapessi approssimativamente la frequenza delle amoniche che compongono la voce umana potresti, in linea teorica, estrarre la voce umana dalla canzone applicando una trasformata discreta di fourier ed eliminando le frequenze non richieste. il problema è che da persona a persona queste frequenze variano in maniera assurda, quindi hai le mani legate. |
|
seitan666
Age :
Join date : 2008-11-26
Posts : 203
Location :
|
Subject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:42 pm |
|
|
eh... ci ho provato con millemila filtri passa banda, diciassei passa basso e ventordici passa alto... ma niente di utile... |
|
Stee_
Age : 36
Join date : 2008-12-01
Posts : 134
Location :
|
Subject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:42 pm |
|
|
Chiedeteglielo al monti...o a metalingargiola |
|
PsycoYack
Age :
Join date : 2008-11-26
Posts : 267
Location :
|
Subject: Re: Filtrare la voce da un file musicale Tue Dec 02, 2008 12:05 am |
|
|
- seitan666 wrote:
- eh... ci ho provato con millemila filtri passa banda, diciassei passa basso e ventordici passa alto... ma niente di utile...
io ho implicitamente detto che dovresti fare un passabanda multiplo. dovresti registrare la tua voce, scomporla e fare un'indagine statistica sulle frequenze dominanti. buona fortuna |
|
PsycoYack
Age :
Join date : 2008-11-26
Posts : 267
Location :
|
Subject: Re: Filtrare la voce da un file musicale Wed Dec 03, 2008 1:23 am |
|
|
mi hai fatto venir voglia di investigare questo problema, allora tanto per perdere un'oretta ho deciso di scrivere qualche riga di codice. il programma disegna tramite gnuplot la media del modulo delle componenti frequenziali di un file audio (tante tante assunzioni: wav, 16 bit, little endian, 44100hz, etc...) prendendo progressivamente blocchi di 44100 campioni, applicando la trasformata discreta di fourier e facendo la media (volevo disegnare anche la varianza, per ovvi motivi, ma non avevo sbatta, magari in futuro). beh, fa grafici buffi, sono interessanti da vedere. - Code:
-
#include <stdio.h> #include <stdlib.h> #include <fftw3.h> #include <math.h>
#define BLOCK_SIZE 44100 #define abs(n) sqrt((n)[0]*(n)[0]+(n)[1]*(n)[1])
typedef signed short int16;
const char *temp_dat = "temp.dat"; const char *title0 = "E[|X(f)|]"; const char *title1 = "E[|X(f)|]dB"; const char *gnuplot = "set terminal png notransparent enhanced size 640,480\n" "set output \"%s\"\n" "%s set logscale x\n" "plot \"%s\" ti \"%s\" with lines\n"; const char *help = "%s input output [x_axis y_axis]\n" "\tinput\t\twav input\n" "\toutput\t\tpng output\n" "\tx_axis\t\t0 -> f; 1 -> log(f)\n" "\ty_axis\t\t0 -> E[|X(f))|]; 1 -> E[|X(f)|]dB\n";
int main(int argc, char **argv) { FILE *fp; int read, i, n = 0, x_axis = 0, y_axis = 0; fftw_complex *input, *transform; fftw_plan p; int16 audio_data[BLOCK_SIZE]; float abs_sum[BLOCK_SIZE]; if(argc < 3) { printf(help, argv[0]); return -1; } if(argc >= 4) x_axis = atoi(argv[3]); if(argc >= 5) y_axis = atoi(argv[4]); fp = fopen(argv[1], "rb"); fseek(fp, 44, SEEK_SET); input = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BLOCK_SIZE); transform = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BLOCK_SIZE); for(i = 0; i < BLOCK_SIZE; i++) { abs_sum[i] = 0; } read = fread(audio_data, sizeof(int16), BLOCK_SIZE, fp); while(read == BLOCK_SIZE) { for(i = 0; i < BLOCK_SIZE; i++) { input[i][0] = audio_data[i]; input[i][1] = 0; } p = fftw_plan_dft_1d(BLOCK_SIZE, input, transform, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); for(i = 20; i < 20000 /*BLOCK_SIZE*/; i++) { abs_sum[i] += abs(transform[i]); } fftw_destroy_plan(p); read = fread(audio_data, sizeof(int16), BLOCK_SIZE, fp); n++; } fftw_free(input); fftw_free(transform); fclose(fp); fp = fopen(temp_dat, "w"); for(i = 20; i < 20000/*BLOCK_SIZE*/; i++) { abs_sum[i] /= n; fprintf(fp, "%d %.5f\n", i, y_axis ? 20*log10(abs_sum[i]) : abs_sum[i]); } fclose(fp); fp = popen("gnuplot", "w"); fprintf(fp, gnuplot, argv[2], x_axis ? "" : "#", temp_dat, y_axis ? title1 : title0); pclose(fp); remove(temp_dat); return 0; } alcuni esempi: - due prove standard con la mia voce
- mia sorella (notare che la distribuzione è concentrata a frequenze più alte, come è giusto che sia)
- io che faccio acuti e suoni strani, risultato assai buffo
beh, non hai minimamente risolto il tuo problema... però ora puoi divertirti a guardare tanti bei grafici, loal. comunque, tendenzialmente pare che le frequenze mediobasse abbiano contributo maggiore (i grafici sono in decibel, quindi effettivamente contribuiscono molto di più), quindi nel tentativo di estrarre la voce potresti moltiplicare la trasformata per una funzione che attenua progressivamente frequenze più alte (non un filtro passabanda ideale perchè taglierebbe nettamente frequenze più elevate) e sperare che venga qualcosa di udibile |
|
seitan666
Age :
Join date : 2008-11-26
Posts : 203
Location :
|
Subject: Re: Filtrare la voce da un file musicale Fri Dec 05, 2008 9:49 pm |
|
|
allora.. ho letto un po' di roba oggi.. in particolare, mi sembra carino questo: Singer Identification in Popular Music Recordings Using Voice Coding Features (che è poi quello che diceva Snagg.. in alternativa
- AUTOMATIC SINGER IDENTIFICATION
- Robust speaker recognition: a feature-based approach
- CONSTRUCTION AND EVALUATION OF A ROBUSTMULTIFEATURE SPEECH/MUSIC
DISCRIMINATOR
- LOCATING SINGING VOICE SEGMENTS WITHIN MUSIC SIGNALS
Da questi la cosa più facilmente fattibile, mi sembra:
- filtro passabanda come in seconda pagina del primo documento (non saprei come farne uno di chebyshev, ma penso che vada bene uno simile)..
- Il discorso dell'armonicità: individuare le frequenze dominanti e trovarne i multipli
Detto così sembra quasi semplice... ma bisogna ragionarci sopra un po'... se qualcun'altro ha sbattimenti di provarci (vedi Yack quà sopra)... fate pure... |
|
PsycoYack
Age :
Join date : 2008-11-26
Posts : 267
Location :
|
Subject: Re: Filtrare la voce da un file musicale Fri Dec 05, 2008 10:40 pm |
|
|
beh, la roba del filtro passabanda attenuato era quello che avevo (correttamente) previsto, però considera che è una cosa estremamente grezza, ed essendo la trasformata di fourirer lineare la trasformata della somma di due segnali è la somma delle trasformate, quindi tecnicamente se due segnali contribuiscono a frequenze equivalenti non hai modo di tornare ai valori originali, ma solo di filtrarlo un pochettino e sperare per il resto non ho sinceramente guardato, magari mi leggo qualcosina se non ho niente da fare lunedì, poi vediamo... |
|
Sponsored content
|
Subject: Re: Filtrare la voce da un file musicale |
|
|
|
|