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

Signal Discussion :

Supprimer le silence d'un fichier .wav


Sujet :

Signal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Supprimer le silence d'un fichier .wav
    Bonjour à tous,

    Je vais tout d'abord commencer par vous présenter mon projet.
    Je suis actuellement au Portugal pour réaliser un stage technicien, le projet étant d'être capable d'identifier une pathologie d'un individu en inspectant le spectre de sa voix.
    Pour commencer, j'étudie le spectre de ma propre voix.

    Je voudrais simplement supprimer le silence au début de l'enregistrement.
    N'étant qu'un débutant sur MATLAB, je voudrais avoir un peu d'aide
    Voici ce que j'ai fait, et que j'ai réussi à trouver sur d'autres forums:


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    %Time code:
    clc;
    clear all;
    close all;
    [y,Fs]=wavread('C:\Users\estaadee\Desktop\Voice.wav');
    T = 1/Fs;
    t=linspace(0,length(y)/Fs,length(y));
    figure(1);
    plot(t, y, 'g')
     
    % On travaille en mono
    y = y(:,1);
     
    % Affichage du signal
    subplot(311)
    plot(y, 'b')
    title('Signal');
     
     
    % Calcul de l'énergie (approximation)
    S = abs(y);
    m = min(S(:));
    S = S - m;
    M = max(S(:));
    S = S/M;
     
    e = S.^2;
     
    % Affichage de e
    subplot(312)
    plot(e, 'r')
    title('Energie');
     
    % Seuillage de e
    seuil = .15;
    e = e>seuil;
     
    % Affichage su seuil
    hold on
    plot([0 numel(e)],[seuil seuil],'m-')
     
    % Détection des "silences"
    s=sign(diff([inf;e].'));
    idxmin=strfind(s,[0 1]);
    idxmax=strfind([0 1], M);
     
    %1ere partie
    signal_debut=S(1:idxmin);
    %2eme partie
    signal_fin=S(idxmax:end);
     
    S(signal_debut:signal_fin) = [];
     
    plot(S, 'b');
    Je comprends bien le principe, le problème est que je ne sais vraiment pas comment supprimer les éléments détectés...

    Merci d'avance,
    Bonne journée à tous!

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Please help
    Ce code fonctionne seulement en partie, mais il ne supprime pas le silence...

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour

    Si tu fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    idx = find(e>seuil);
    y2 = y(idx);
    % plot du y2...
    N'obtiens-tu pas ce que tu désires?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci de votre réponse.

    Je n'arrive toujours pas au résultat souhaité, mais il n'y a plus d'erreurs.


    Voici le code:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    %Time code:
    clc;
    clear all;
    close all;
    [y,Fs]=wavread('C:\Users\adee\Desktop\Project Voice Analysis\Part I - my voice\Voice.wav');
    T = 1/Fs;
    n=length(y);
    t=linspace(0,length(y)/Fs,length(y));
    figure
    plot(t, y, 'g')
     
    % On travaille en mono
    y = y(:,1);
     
    % Calcul de l'énergie (approximation)
    S = abs(y);
    m = min(S(:));
    S = S - m;
    M = max(S(:));
    S = S/M;
     
    e = S.^2;
     
    % Affichage de e
    subplot(312)
    plot(e, 'r')
    title('~Energie~');
     
    % Seuillage de e
    seuil = 1;
    e = e>seuil;
     
    % Affichage du seuil
    hold on
    plot([0 numel(e)],[seuil seuil],'m-')
     
    % Détection des "silences"
    s=sign(diff([inf;e].'));
    idxmin=strfind(s,[0 1]);
    signal_debut=s(1:idxmin);
     
    idxmin = find(e>seuil);
    y2 = y(idxmin);
     
    s(idxmin:end) = [];
    figure
    plot(y2, 'b');

  5. #5
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Est-il possible de mettre en pièces jointes le fichier audio ??
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je vous le link.

    Merci bien
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Je pense qu'il y a un problème dans le seuil que tu as défini, essayes ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    seuil = max(e)*0.1; % C'est à toi de définir ce coefficient
    index =find(e>seuil);
    audiowrite('VoiceSansSilence.wav',y(index(1):index(end)),Fs)
    J'ai supposé qu'il y a pas de silence au milieu de ton signal, mais tu peux facilement le supprimer (Tu dois définir la durée minimal d'un silence).
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci bien pour l'aide, ça m'aide beaucoup!

    Selon ma logique, qui n'est certainement pas la bonne, je devrais avoir une ligne du genre : y=signal_sans_silence et après faire un plot de y. A quoi sert l'autowrite alors?
    Et quel est ce son dfsf.wav?

    Voici le nouveau code :

    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
     
    % On travaille en mono
    y = y(:,1);
     
    % Calcul de l'énergie (approximation)
    S = abs(y);
    m = min(S(:));
    S = S - m;
    M = max(S(:));
    S = S/M;
     
    e = S.^2;
     
    % Affichage de e
    subplot(312)
    figure
    plot(e, 'r')
    title('~Energie~');
     
    % Seuillage de e
    seuil = max(e)*0.1; 
    e = e>seuil;
     
    % Affichage du seuil
    hold on
    plot([0 numel(e)],[seuil seuil],'m-')
     
    % Détection des "silences"
    index =find(e>seuil);
    audiowrite('dfsf.wav',y(index(1):index(end)),Fs)
    Merci encore pour le temps que vous m'accordez.

  9. #9
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    audiowrite c'est pour enregistrer ton nouveau signal sous le nom dfsf.wav (j'ai modifié le nom par VoiceSansSilence.wav)

    Pour visualiser ton nouveau signal sans le silence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    figure
    NewY=y(index(1):index(end));
    plot(t(index(1):index(end)),NewY)
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Super merci beaucoup pour l'aide, ça fonctionne!

    Un petit défaut que je n'arrive pas à résoudre, c'est qu'avec ce code, mon plot au début du code qui affiche le signal d'entrée non retouché, ne fonctionne pas, rien n'est affiché sur le graph...
    Mais bon ce n'est pas un réel problème

    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    %Time code:
    clc;
    clear all;
    close all;
    [y,Fs]=wavread('C:\Users\adee\Desktop\Project Voice Analysis\Part I - my voice\Voice.wav');
    T = 1/Fs;
    n=length(y);
    t=linspace(0,length(y)/Fs,length(y));
    figure
    plot(t, y, 'g')

  11. #11
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    C'est bizarre, avec ton code j'obtiens ça :
    Nom : untitled.jpg
Affichages : 714
Taille : 20,0 Ko
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Oui bizarre, je ne l'obtiens pas moi :/

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    En réalité mon code fait tout ça:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    %Time code:
    clc;
    clear all;
    close all;
    [y,Fs]=wavread('C:\Users\adee\Desktop\Project Voice Analysis\Part I - my voice\Voice.wav');
    T = 1/Fs;
    n=length(y);
    t=linspace(0,length(y)/Fs,length(y));
    figure
    plot(t, y, 'g')
     
    %Delete the silence at the beginning:
     
    y = y(:,1);% On travaille en mono
     
    % Calcul de l'énergie (approximation)
    S = abs(y);
    m = min(S(:));
    S = S - m;
    M = max(S(:));
    S = S/M;
     
    e = S.^2;
     
    % Affichage de e
    subplot(312)
    figure
    plot(e, 'r')
    title('~Energie~');
     
    % Seuillage de e
    seuil = max(e)*0.2; 
    e = e>seuil;
     
    % Affichage du seuil
    hold on
    plot([0 numel(e)],[seuil seuil],'m-')
     
    % Détection des "silences"
    index =find(e>seuil);
    audiowrite('VoiceSansSilence.wav',y(index(1):index(end)),Fs)
     
    figure
    NewY=y(index(1):index(end));
    plot(t(index(1):index(end)),NewY)
     
     
     
    %FFT code:
    NFFT = 2^nextpow2(length(NewY)); % Next power of 2 from length of y
    Y = fft(NewY,NFFT)/length(NewY);
    f = Fs/2*linspace(0,1,NFFT/2+1);
    FFT_signal= Y(1:NFFT/2+1);
    % Plot single-sided amplitude spectrum.
    figure
    plot(f,2*abs(FFT_signal)) 
    title('Spectrum of y(t)')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')
     
    %Zoom on FFT
    figure
    idx_3=find(f>0.3e4,1); 
    plot(f(1:idx_3),abs(FFT_signal(1:idx_3)));
    title('Spectrum of y(t) zoomed')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')
     
    %Parts of the signal
    NFFT = 2^nextpow2(length(NewY));
    Y=fft(NewY(t>=2 & t<=3),NFFT);
    f=-Fs/2:Fs/NFFT:Fs/2-Fs/NFFT;   %Making the frequency vector
    figure
    plot(f,abs(Y));
    title('Spectrum of signal(t)');
    xlabel('Frequency (Hz)');
    ylabel('|signal(f)|');

  14. #14
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    tu mets en commentaire la ligne n°27, qui à mon sens ne sert à rien, en plus elle écrase ta première figure.
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Super merci beaucoup!

    A peut-être pour de nouvelles aventures ! ^^

    Bonne journée!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. eliminer le silence a partir d'un fichier wav
    Par fcboumi13 dans le forum Signal
    Réponses: 17
    Dernier message: 19/05/2009, 00h46
  2. Analyse d'un fichier WAV et détection de silence
    Par bartmanb dans le forum Audio
    Réponses: 21
    Dernier message: 08/02/2009, 19h20
  3. Détection de silences dans un fichier .wav
    Par picard64 dans le forum Signal
    Réponses: 7
    Dernier message: 09/06/2008, 13h10
  4. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43
  5. [Kylix] jouer un fichier wav avec kilyx
    Par JlouisI dans le forum EDI
    Réponses: 1
    Dernier message: 14/06/2002, 02h05

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