Python soundfile 音频客户端通过套接字连接到 Matlab 服务器

标签 python matlab audio

我需要从 Python 读取音频 WAVE 文件并将数据传输到在 MATLAB 中监听特定端口的远程服务器套接字。我正在尝试为此使用 Python 中的声音文件模块。我发现音频数据没有按原样传输到 MATLAB 服务器,因此传输的音频数据没有在服务器中播放。

这是我在客户端(Python)上的代码:

   import soundfile as sf
   s = socket.socket()
   port = 30000
   s.connect(('127.0.0.1',port))

   data, samplerate = sf.read('speechrecord.wav')
   s.send(data)
   s.close()

这是MATLAB服务器端的代码:
   t=tcpip('127.0.0.1', 30000, 'NetworkRole', 'server');
   fopen(t);
   data = char(fread(t,128,'float'))
   fclose(t);

尝试了在 MATLAB 端使用不同的 fread 读取音频数据的不同组合。但是这些组合似乎都不起作用。

连接成功。 Python 客户端代码成功连接到 MATLAB 服务器(服务器中的“fopen”调用脱离阻塞状态)。客户端上也生成了一些数据,然后发送到服务器。但是,使用此 fread 调用在 MATLAB 服务器上接收到的数据与客户端发送的数据完全不同(甚至没有一个字节匹配)。

如果有人使用此组合来传输音频数据,请告知实现此目标的最佳方法。

最佳答案

问题

可悲的是,您的问题是多方面的。它们主要源于以下几行,也许还有一些误解。

MATLAB

data = char(fread(t, 128, 'float'))

python
s.send(data)

在 Python 中,您通过套接字发送浮点数,然后将它们转换为字符数组。这会将所有内容四舍五入到 0你最终得到一个 ASCII 数组 0/NULL 字符。 Check the char docs for more info

我也不相信从 python 发送数据时的字节顺序是正确的。因此,您需要考虑使用 struct packageformat your data correctly .

解决方案

我想说,在尝试连接 python 中的指定套接字/端口之前,将 MATLAB 服务器设置为监听更为重要,以避免 ConnectionRefusedError
您需要将浮点数打包成 bytearray ,这就是为什么 struct包被导入。对于单个样本,这是通过以下函数调用实现的:

bytearray(struct.pack(">f", sample))

注意:仪器工具箱 tcpip()默认情况下,对象似乎是大端。

以下脚本仅发送第一个 100音频文件的样本。下一个任务是创建一个系统,您可以在其中检查是否成功传输。在套接字文档中的话:

应用程序负责检查所有数据是否已发送;如果仅传输了部分数据,则应用程序需要尝试传输剩余数据。有关此主题的更多信息,请咨询 Socket Programming HOWTO .

播放, soundsc() 应该做这项工作,因为它会在播放前标准化音频并避免任何讨厌的噪音。

MATLAB

请记住,这仍然只会显示 100值(value)观。

t = tcpip('localhost', 30000, 'NetworkRole', 'server');
fopen(t);                       % this is blocking block until a connection is made
data = fread(t, 100, 'float');  % this is blocking until it receives 100 floats
fclose(t);
plot(data);
disp(data); % sanity check, should be the same as Python script print

python

这只会发送第一个 100值(value)观。

import soundfile as sf
import socket
import struct

audio_file_path = 'path/to/audio.wav'
data, sample_rate = sf.read(audio_file_path)
data_bytes = bytearray()

s = socket.socket()
port = 30000
s.connect(('127.0.0.1', port))

for sample in data[0:100]:
    data_bytes = data_bytes + bytearray(struct.pack(">f", sample))

s.send(data_bytes) # blocks until all data sent
s.close()

print(data[0:100]) # sanity check

依赖项

上述代码的依赖项是:

MATLAB
  • Instrument Control Toolbox

  • Python
  • SoundFile
  • 关于Python soundfile 音频客户端通过套接字连接到 Matlab 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579628/

    相关文章:

    matlab - 如何使图例线条与我在 MATLAB 脚本中设置的线条颜色和宽度相匹配?

    c# - 在 Debug模式下的DirectX音频视频错误消息

    java - 向 Java 程序添加音乐/声音

    macos - 在 Mac 终端上执行命令后如何播放声音警报?

    python - 如何从现有的 Numpy 数组创建 Numpy 数组

    r - 以与R的bs()函数相同的方式在Matlab中计算B样条基

    python - 读取机器人框架中的excel内容

    matlab - 如何生成所有可能的组合 n 位字符串?

    python - Pandas 在每第 n 行后插入一个新行

    Python提取关键字和括号后的文本