IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

Fonction 'voice remover' et transformation de fourrier


Sujet :

Multimédia Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut [résolu]Fonction 'voice remover' et transformation de fourrier
    bonjour a tous,
    Actuellement a la fac, j'ai dans le cadre de mes études a developper un lecteur Karaoké.
    par ailleurs, l'utilisateur peut creer lui meme ces pistes karaoké: cette possibilité sera appeler "voice remover".
    pour faire cela j'utilise du code que j'ai trouvé à cette page en java,ici.
    les morceau que j'ai utilisé sont iDFT et invDFT.
    j'ai codé le tt comme ceçi avec un main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public static int[]traitementFFT1(int[]signal) throws Exception{
    		double[]signalDouble=new double[signal.length];
    		for(int i=0;i<signal.length;i++){
    			signalDouble[i]=signal[i];
    		}
    		 rDFT = new double[signal.length]; //partie entiere
    		/*erreur après compilation*/iDFT= new double[signal.length]; //partie imaginaire
    		 DFT(signalDouble,rDFT,iDFT);
    		 double[]sortie1=new double[signal.length];
    		 invDFT(rDFT,iDFT,sortie1);
    		 int[]sortie2=new int[sortie1.length];
    		 for(int i=0;i<sortie1.length;i++){
    			 sortie2[i]=(int)sortie1[i];
    		 }
    		return sortie2;
    	}
     
    	static int[] voixGauche=null;
    	static int[] voixDroite=null;
     
    	public static void main(String[] args) throws Exception {
    		Lecture player = new Lecture("Shakira - Did It Again.wav");
    		byte[]signal=player.getSamples();
    		voixGauche= voixGauche(signal);//ok : partie gauche deu signal,
    		voixDroite = voixDroite(signal);//ok : partie droite du son
    		System.out.println(player.format.toString() + " "
    				+ player.getSamples().length);
    		//mix permet de jouer le morceau en un seul.
    		InputStream stream = new ByteArrayInputStream(mix(voixDroite,traitementFFT1(voixGauche)));//ok
    		player.play(stream);
    		DataInputStream dis = new DataInputStream(stream);
    	}
    et lors de l'excecution j'obtiens une erreur de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 34209792
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at Sound.traitementFFT1(Sound.java:146)
    	at Sound.main(Sound.java:185)
    quelqu'un serai t'il capable de m'expliquer cette erreur,et comment faire pour ne plus l'avoir?
    par ailleurs je vous donne le fichier eclipse.ini
    dont j'ai fait quelques modifications qui n'ont strictement rien changer à mon problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -startup
    plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
    -product
    org.eclipse.epp.package.jee.product
    --launcher.XXMaxPermSize
    256M
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    >>>ajouter par moi  -XX:MaxPermSize=256m
    >>>ajouter par moi   -Xms60m
    >>>ajouter par moi   -Xmx1024m
    j'espere que quelqu'un pourra m'aider car la je sais plus comment faire..
    merci d'avance à tous ceux qui prendront la peine de m'aider.
    cordialement,
    et bonne nuit

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Bien sure, tu dépasse la mémoire allouable maximum.

    Dans Eclipse, au moment du run tu choisis "Run as ..." , puis "Run configurations". Tu choisis l'onglet arguments et pour les argument de la VM tu mets par exemple :

    après à toi de voir la consommation de ton code et d'ajuster cette valeur.

    Même chose pour l'exécution hors eclipse, il faudra aussi le spécifier.

    EDIT :

    Ha oui ton fichier .ini j'avais pas vu...
    Est-ce que ces valeurs vont servir pour les programme qu'eclipse lance, ou bien juste pour faire tourner eclipse ??? (je pencherais pour le 2 eme, je demande confirmation).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    bonjour et merci de me répondre,
    en effet cette fois ci en faisant cette modification, tout change, j'ai plus le "out of menory exception".
    c'est une bonne chose de fait.
    je pense que le fichier eclipse.ini permettait au fait de régler les paramètres de lancement de eclipse et non la compilation sous eclipse,tant mieux pour moi d'ailleurs..
    mais par contre je vois que mon code ne fonctionne pas, auriez-vous une idée, une piste à explorer pour supprimer la voix dans une chanson?

    je suis partis de cette idée pour le faire:
    -découper la chanson en partie Gauche puis Droite;
    -prendre la partie Gauche, cherché son inverse;
    -faire une sommation de la partie inverseGauche + Droite;ce qui supprime la voix en commun sur la partie gauche et droite,
    -réecrire le tout dans un fichier .mp3 ou autre

    en ce moment je sèche sur le fait que j'arrive pas a faire l'inverseGauche.
    avez-vous une idée??
    merci d'avance

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Bah je ne suis pas du tout spécialiste pour te répondre en fait malheureusement.

    Par curiosité seulement, "prendre la partie Gauche, cherché son inverse" tu parles de l'inverse de fourrier ou l'inverse de l'amplitude du signal ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    mon objectif est de partie du coté gauche du son ,et chercher son inverse pour qu'en faisant une somme de la partie droite et l'inverseGauche j'obtiens un son ou on ne retrouve plus la voix du chanteur.
    je pense que dans mon cas il me faudrait l'inverse de l'amplitude du signal pour que quand je fais ma somme j'obtiens ce que je veux..
    plus clairement, mon objectif est d'avoir une sorte de filtre qui lorsque je l'applique sur la plage de fréquences correspondant à la voix humaine(500-4500Hz), il me donne le son que je veut..
    pour exemple, la methode "voice-remover" de winmanp ou audacity.

    je sais pas si je suis claire dans ce que je dis..
    voila

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Non mais j'avais bien compris dés le départ ce que tu veux obtenir ne t'inquiete pas.

    L'inverse de l'amplitude d'un signal a un instant T est égale a 1 - la valeur que tu lis dans le buffer du son.

    C'est évidemment diffèrent du filtrage de fréquence. Mais qu'importe ...

    Sinon il y'a un truc qui me parrait bizarre, mais peut etre pas, c'est le fait que tu envoye a ta fonction DFT des doubles []. Puis tu les caste en int.

    Si tes doubles varient de 0 a 1, je présume que tu as oublié de faire une * 32767 pour reetalonner les valeurs si ce sont des entiers que tu veux obtenir au final. (ce que je vx dire, c'est que si tes valeur sont de l'ordre de 0 a 1 flottant, tu la cast en int et tu vas presque toujours obtenir 0 et donc rien n'ira).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    bonsoir,
    merci de votre coup de main, en effet j'ai pu régler mon problème en partant de votre idée qui était que l'inverse du signal était, 1-signal..
    grâce à cela, j'ai pu faire ma fonction voice remover, et j'ai reussit à le faire fonctionner.

    Maintenant, je souhaite écrire mon ByteArrayInputStream contenant mon tableau de byte dans un fichier de type mp3 ou wav..

    j'ai comme idée de base d'écrire le tableau dans un fichier .txt et faire une lecture de ce fichier à chaque fois.
    c'est une possibilité mais je pense que ça serait mieux de l'écrire dans un fichier mp3 ou wav ou même un fichier.kar.
    pourriez vous m'aidez??me donnez une démarche à suivre pour pouvoir faire cette écriture?
    merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class Test{
    	static byte[]signal=null;
     
    	public static void main(String[]args) throws Exception{
    		Test testthread= new Test();
    		Lecture player = new Lecture("Indochine - Playboy.wav");
    		signal=player.getSamples();
    		System.out.println(player.format.toString() + " "
    				+(int) player.getSamples().length +" ");
    		int longueurTableau=signal.length;
    		//on enleve la voix le résultat est un ByteArrayInputStrean
    		ByteArrayInputStream stream=VoiceRemover.noVoice(signal);
    		player.play(stream);
    		DataInputStream dis = new DataInputStream(stream);
    		stream.close();
    	}
    }

Discussions similaires

  1. Calculer une transformer de fourrier un peu spéciale
    Par 2click dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/01/2008, 17h28
  2. Detection Audio - Transformée de Fourrier
    Par Black-Ghost dans le forum C#
    Réponses: 8
    Dernier message: 03/12/2007, 08h34
  3. [Signal] Transformé de Fourrier
    Par kurul1 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/12/2006, 08h30
  4. Transformé de Fourrier
    Par kurul1 dans le forum C++Builder
    Réponses: 15
    Dernier message: 06/12/2006, 08h24
  5. Réponses: 14
    Dernier message: 16/05/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo