Come faccio a riprodurre un suono in Ottava?
-
16-09-2019 - |
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?
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:
- 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). - È hard-coded per l'uso
paplay
, una riga di comando pulseaudio giocatore. - Il
paplay
chiamata non funzionerà mai perchépaplay
di defaults16ne
(probabilmente un errore di battitura;Penso che significavas16be
- con segno a 16 bit big endian), eplayaudio
scrive senza segno a 8 bit! - Si chiama utilizzando
system()
.Sempre una cattiva idea. - Scrive l'uscita audio di un file, piuttosto che la riproduzione in streaming.Potrebbe causare problemi per file di grandi dimensioni.
- 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!
- 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.