Domanda

Ottava appare scontato che un suono specifico, la riproduzione di utilità sarà disponibile in un sistema, ma non sembra fornire la possibilità di specificare un supplente.Il messaggio di errore riportato di seguito, Ottava è alla ricerca di ofsndplay, che non è un programma di utilità disponibili su tutti i sistemi.

ottava:38> audio(beamformed_20)

sh:ofsndplay:comando non trovato

C'è un'Ottava impostazione di configurazione o frammento di codice che è possibile utilizzare per specificare un sistema-utilità appropriata?

È stato utile?

Soluzione 3

In una delle mie macchine Linux, ho creato il seguente ofsndplay script per risolvere la dipendenza hard-wired:

$ cat /usr/bin/ofsndplay

#!/bin/sh
## Coping with stupid dependency on ofsndplay in octave
play -t au -

Questo script particolare utilizza l'utilità SoX play.

Certo, il commento non è necessario per la funzionalità, ma certamente mi ha fatto sentire meglio ....

Altri suggerimenti

ho sovrascritto la funzione playaudio dalla ottava con la seguente funzione. Questo funziona solo dopo l'installazione di sox .

sudo apt-get install sox

(in Ubuntu)

function [ ] = playaudio (x, sampling_rate)

    if nargin == 1
        sampling_rate = 8000
    end
    file = tmpnam ();
    file= [file, '.wav'];
    wavwrite(x, sampling_rate, file);
    ['play ' file ]
    system(['play ' file ]);
    system(['rm ' file]);
end

Un approccio simile vi permetterà di registrare anche:

% Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2005,
%               2006, 2007 John W. Eaton
%
% This file is part of Octave.
%
% Octave is free software; you can redistribute it and/or modify it
% under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 3 of the License, or (at
% your option) any later version.
%
% Octave is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
% General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Octave; see the file COPYING.  If not, see
% <http://www.gnu.org/licenses/>.

% -*- texinfo -*-
% @deftypefn {Function File} {} record (@var{sec}, @var{sampling_rate})
% Records @var{sec} seconds of audio input into the vector @var{x}.  The
% default value for @var{sampling_rate} is 8000 samples per second, or
% 8kHz.  The program waits until the user types @key{RET} and then
% immediately starts to record.
% @seealso{lin2mu, mu2lin, loadaudio, saveaudio, playaudio, setaudio}
% @end deftypefn

% Author: AW <Andreas.Weingessel@ci.tuwien.ac.at>
% Created: 19 September 1994
% Adapted-By: jwe
% And adapted again 11/25/2010 by Rob Frohne    
function X = record (sec, sampling_rate)


  if (nargin == 1)
    sampling_rate = 8000;
  elseif (nargin != 2)
    print_usage ();
  endif

  file = tmpnam ();
  file= [file,".wav"];

  input ("Please hit ENTER and speak afterwards!\n", 1);

  cmd = sprintf ("rec -c1 -r%d %s trim 0 %d",
                   sampling_rate, file, sec)

  system (cmd);

  X = wavread(file);

end

Installa alsa-utils o pulseaudio-utils e inserire il seguente nel vostro ~ / .octaverc:

global sound_play_utility = 'aplay';

o

global sound_play_utility = 'paplay';

playaudio è rotto!!!

Vale la pena leggere l'implementazione di default di playsound (versione 3.6.2):

function playaudio (name, ext)

  if (nargin < 1 || nargin > 2)
    print_usage ();
  endif

  if (nargin == 1 && isnumeric (name))
    ## play a vector
    if (! isvector (name))
      error ("playaudio: X must be a vector");
    endif
    X = name(:) + 127;
    unwind_protect
      file = tmpnam ();
      fid = fopen (file, "wb");
      fwrite (fid, X, "uchar");
      fclose (fid);
      [status, out] = system (sprintf ('cat "%s" > /dev/dsp', file));
      if (status != 0)
        system (sprintf ("paplay --raw \"%s\"", file))
      endif
    unwind_protect_cleanup
      unlink (file);
    end_unwind_protect
  elseif (nargin >= 1 && ischar (name))
    ## play a file
    if (nargin == 1)
      name = [name ".lin"];
    elseif (nargin == 2)
      name = [name "." ext];
    endif
    if (any (strcmp (ext, {"lin", "raw"})))
      [status, out] = system (sprintf ('cat "%s" > /dev/dsp', name));
      if (status != 0)
        system (sprintf ('paplay --raw "%s"', name))
      endif
    elseif (any (strcmp (ext, {"mu", "au" "snd", "ul"})))
      [status, out] = system (sprintf ('cat "%s" > /dev/audio', name));
      if (status != 0)
        system (sprintf ('paplay "%s"', name))
      endif
    else
      error ("playaudio: unsupported extension '%s'", ext);
    endif
  else
    print_usage ();
  endif

endfunction

Ci sono alcune cose da notare:

  1. La scrittura direttamente su /dev/dsp fallisce sempre nelle ultime distribuzioni di linux, in modo che ogni volta si esegue il comando, si avrà un errore (sul cat > /dev/dsp la linea).
  2. È hard-coded per l'uso paplay, una riga di comando pulseaudio giocatore.
  3. Il paplay chiamata non funzionerà mai perché paplay di default s16ne (probabilmente un errore di battitura;Penso che significava s16be - con segno a 16 bit big endian), e playaudio scrive senza segno a 8 bit!
  4. Si chiama utilizzando system().Sempre una cattiva idea.
  5. Scrive l'uscita audio di un file, piuttosto che la riproduzione in streaming.Potrebbe causare problemi per file di grandi dimensioni.
  6. A differenza di matlab, non gestire in virgola mobile audio.Effettivamente supporta solo audio a 8 bit!Tipo di stupido, visto che è il risultato restituito da wavread!
  7. A differenza di matlab, non solo supporta una frequenza di campionamento di 44.100 Hz).

Questa funzione è molto sporca, insicuro e inaffidabile.Se in qualche modo rappresenta il codice qualità altrove in Ottava...bene, il che è preoccupante.Si dovrebbe davvero essere reintrodotto come propria funzione nella Ottava utilizzando portaudio.

Leggermente meglio la versione

Io in realtà non hanno il tempo o la motivazione per fare un sacco di hacking su ottava, così nel frattempo mi consiglia invece di utilizzare questo leggermente migliore funzione:

function playsound(wav, samplerate)
  # Play a single-channel wave at a certain sample rate (defaults to 44100 Hz).
  # Input can be integer, in which case it is assumed to be signed 16-bit, or
  # float, in which case it is in the range -1:1.

  if (nargin < 1 || nargin > 2)
    print_usage();
  endif

  if (nargin < 2)
    samplerate = 44100;
  end

  if (!isvector(wav))
    error("playsound: X must be a vector");
  endif

  # Write it as a 16-bit signed, little endian (though the amaaazing docs don't say the endianness)

  # If it is integers we assume it is 16 bit signed. Otherwise we assume in the range -1:1
  if (isfloat(wav))
    X = min(max(wav(:), -1), 1) * 32767; # Why matlab & octave do not have a clip() function... I do not know.
  else
    X = min(max(wav(:), -32767), 32767) + 32767;
  endif
  unwind_protect
    file = tmpnam ();
    fid = fopen (file, "wb");
    fwrite (fid, X, "int16");
    fclose (fid);
    # Making aplay (alsa) the default, because let's be honest: it is still way more reliable than
    # the mess that is pulseaudio.
    if (exist("/usr/bin/aplay") == 2)
      system(sprintf("/usr/bin/aplay --format=S16_LE --channels=1 --rate=%d \"%s\"", samplerate, file))
    elseif (exist("/usr/bin/paplay") == 2)
      system(sprintf("/usr/bin/paplay --format=s16le --channels=1 --rate=%d --raw \"%s\"", samplerate, file))
    endif
  unwind_protect_cleanup
    unlink (file);
  end_unwind_protect

endfunction

Questo è ancora molto sporca funzione.Ma dovrebbe essere almeno un po ' più affidabile playaudio!Lascio un'implementazione di soundsc come esercizio per il lettore.

Sono su un Mac (Yosemite), e ha scoperto una soluzione più semplice di quello che altri hanno suggerito. Nel caso in cui questo è ancora rilevante per chiunque:

Per prima cosa installare SoX: http://sox.sourceforge.net/

(via Homebrew)

brew install sox

Ora nella riga di comando del terminale è possibile utilizzare:

play “/path/to/sound file.wav"

... e si sente bella musica.

Ma questo comando non funziona dall'interno di Octave. Questo funziona:

system(‘play “/path/to/sound file.wav”’);

Su OSX, questo è quello che ho fatto per ottenere lavoro suono:

dal comando sound aiuto:

This function writes the audio data through a pipe to the program "play" from the sox distribution. sox runs pretty much anywhere, but it only has audio drivers for OSS (primarily linux and freebsd) and SunOS. In case your local machine is not one of these, write a shell script such as ~/bin/octaveplay, substituting AUDIO_UTILITY with whatever audio utility you happen to have on your system: #!/bin/sh cat > ~/.octave_play.au SYSTEM_AUDIO_UTILITY ~/.octave_play.au rm -f ~/.octave_play.au and set the global variable (e.g., in .octaverc) global sound_play_utility="~/bin/octaveplay";

ho chiamato il seguente script "octaveplay" e metterlo in ~ / bin:

cat > ~/.octave_play.aif
afplay ~/.octave_play.aif
rm -f ~/.octave_play.aif

Poi ho creato .octaverc e ha aggiunto: global sound_play_utility="~/bin/octaveplay";

Voila!

In Octave 4.2.1. È possibile riprodurre un file wav come segue

Salvare il seguente codice in un file playWav.m

function playWav(inputFilePath)
  [y, fs] = audioread(inputFilePath);
  player  = audioplayer(y, fs);
  playblocking(player)
end

Poi si può chiamare la funzione come playWav('/path/to/wavfile'); dalla ottava riga di comando.

Testato su Windows 7.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top