如何在八度中播放声音?

八度似乎假设一个特定的声音播放工具将在系统上可用,但似乎没有提供指定替代的能力。 在下面的错误中,Octave正在寻找ofsndplay ,这不是在所有系统上可用的实用程序。

八度:38>声音(beamformed_20)

sh:ofsndplay:找不到命令

有没有一个八度configuration设置或代码片段,我可以用来指定一个系统相应的工具?

Solutions Collecting From Web of "如何在八度中播放声音?"

我已经用下面的函数从八度覆盖了playaudio函数。 这只能在安装sox之后才能使用。

 sudo apt-get install sox 

(在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 

类似的方法也可以让你记录:

 % 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 

安装alsa-utils或者pulseaudio-utils ,把下面的代码放到〜/ .octaverc中:

 global sound_play_utility = 'aplay'; 

要么

 global sound_play_utility = 'paplay'; 

在我的一台Linux机器上,我创建了以下的剧本脚本来解决硬连线的依赖问题:

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

这个特定的脚本使用SoX play工具。

诚然,评论是不必要的功能,但它肯定让我感觉更好….

playaudio坏了!

playsound (版本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 

有一些事情要注意:

  1. 直接写入/ dev / dsp总是在最新的linux发行版中失败,所以每次运行该命令时都会出现错误(在cat > /dev/dsp行)。
  2. 它使用paplay (一种命令行的pulseaudio播放器)进行硬编码。
  3. paplay调用将永远不会工作,因为paplay默认s16ne (可能是一个错字;我认为他们的意思是s16be – 有符号的16位大端), playaudio写无符号8位!
  4. 它使用system()来调用它。 总是一个坏主意。
  5. 它将音频写入文件而不是流式传输。 可能会导致大文件的问题。
  6. 不像matlab,它不处理浮点音频。 它实际上只支持8位音频! 这种愚蠢的,因为这是由wavread返回的结果!
  7. 不像matlab,它只支持一个采样率(44100赫兹)。

这个功能是非常hacky,不安全和不可靠的。 如果它以任何方式代表八度其他地方的代码质量…那么,这是令人担忧的。 它应该真的真的被重新实现为使用portaudio的Octave中的正确函数。

稍微好一点的版本

我真的没有时间和动力去做很多的八度音,所以同时我建议你使用这个更好的功能:

 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 

这仍然是一个非常hacky的功能。 但它至少应该比playaudio更可靠一些! 我将为读者留下一个soundsc的实现。

我在一个Mac(优胜美地),发现比其他人建议的更简单的解决方案。 以防万一这对任何人都有用:

首先安装SoX: http ://sox.sourceforge.net/

(通过自制软件)

 brew install sox 

现在在终端命令行上,你可以使用:

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

…你会听到美妙的音乐。

但是这个命令在Octave中不起作用。 这工作:

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

在OSX上,这是我所做的工作:

来自sound命令的帮助:

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 (eg, in .octaverc) global sound_play_utility="~/bin/octaveplay";

我将以下脚本命名为“octaveplay”,并将其放入〜/ bin:

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

然后我创建.octaverc并添加: global sound_play_utility="~/bin/octaveplay";

瞧!