小编Jim*_*tez的帖子

使用sox进行语音检测和流式传输

目前,我像这样使用sox:

sox -d -e u-law --endian little -b 8 -c 1 -r 8000 -t ul - silence 1 0.3 1% 1 0.3 1%
Run Code Online (Sandbox Code Playgroud)

作为参考,这是从默认麦克风录制音频并以8位和8k速率输出小端,ulaw格式的音频.效果滤波器修剪音频,直到噪声达到阈值0.3秒,然后继续记录,直到有0.3秒的静音.所有这些流到stdout,我用它来流式传输到远程服务器.

当我说完话语时,我正在使用所有这些来记录一些声音并完成.为了触发sox,我使用专门的硬件来触发录制的开始.我可以切换到使用几乎任何音频格式或编解码器,只要它支持即时格式化/编码.我的目标平台是覆盆子pi 2 B上的raspbian.

我理想的解决方案是使用vad在用户讲完后停止录音.我希望即使背景喋喋不休,这也会奏效.但是,关于vad效果的sox文档说明了这一点:

建议使用标准效果,但请记住,反向和标准都不适合与流式音频一起使用.

我无法将参数拼凑在一起以获得vad和流媒体工作.是否可以使用vad效果来停止音频录制,同时仍然保持stdin-> sox-> stdout管道?还有更好的选择吗?

audio audio-recording voice-recording sox raspberry-pi

9
推荐指数
1
解决办法
3287
查看次数

使用python readline时如何获取(并设置)当前bash光标位置?

我有一个python脚本,它管理任何应用程序的stdin,stdout和stderr,并允许正常插入readline.想想任何具有大量控制台输出的应用程序,但也接受来自stdin的命令.

无论如何,我的脚本使用这两个函数:

def blank_current_readline():
    # Next line said to be reasonably portable for various Unixes
    (rows,cols) = struct.unpack('hh', fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ,'1234'))

    text_len = len(readline.get_line_buffer())+2

    # ANSI escape sequences (All VT100 except ESC[0G)
    sys.stdout.write('\x1b[2K')                         # Clear current line
    sys.stdout.write('\x1b[1A\x1b[2K'*(text_len/cols))  # Move cursor up and clear line
    sys.stdout.write('\x1b[0G')                         # Move to start of line

def print_line(line):
    global cmd_state
    blank_current_readline()
    print line,
    sys.stdout.write(cmd_state["prompt"] + readline.get_line_buffer())
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

处理stdout时,我调用print_line().这会使用户输入的内容空白,打印该行,然后恢复用户的输入文本.这一切都在没有用户注意到事情的情况下发生.

当光标不在用户键入的任何输入的末尾时,会发生此问题.当光标位于测试中间并打印一行时,光标将自动放置在输入的末尾.要解决这个问题,我想在print_line中做类似的事情:

def print_line(line):
    global cmd_state
    cursorPos = getCurrentCursorPos() #Doesn't exist
    blank_current_readline()
    print line,
    sys.stdout.write(cmd_state["prompt"] + …
Run Code Online (Sandbox Code Playgroud)

python bash readline

8
推荐指数
1
解决办法
7071
查看次数