私はpythonサーバーにpcmデータを送信するアプリケーションを開発しようとしています。アンドロイドからPythonサーバーまでの時間長のフレーミングバイトパケットはどうですか?
私は、リアルタイムのオーディオ信号を取得するためにaudiorecordのライブラリを使用していました。
そして、これはソースコードです。
/*------ setting audio recording ------*/
private static final int SAMPLE_RATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private boolean isRecording = true;
private AudioRecord recorder = null;
private Thread recordingThread;
private AudioTrack player;
//byte[] TotalByteMessage;
/*------ about socket communication ------*/
public DatagramSocket socket;
private int port = 7979;
String IP = "192.168.0.4";
/*------ Recording, Playing and Sending packets method ------*/
private void startStreaming() {
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
try {
/*------about socket------*/
socket = new DatagramSocket();
Log.d(LOG_NW, "Socket Created!");
DatagramPacket packet;
InetAddress destination = InetAddress.getByName(IP);
Log.d(LOG_NW, "Address retrieved!");
/*------setting recording && playing------*/
//get MinBufferSize for audio recording
int Buffer_Size = AudioRecord.getMinBufferSize(SAMPLE_RATE,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
Log.d(LOG_Audio, "Min buffer size is " + Buffer_Size);
if (Buffer_Size == AudioRecord.ERROR || Buffer_Size == AudioRecord.ERROR_BAD_VALUE) {
Buffer_Size = SAMPLE_RATE * 2;
}
recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION,
SAMPLE_RATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, Buffer_Size);
if (recorder.getState() != AudioRecord.STATE_INITIALIZED) {
Log.d(LOG_Audio, "Audio Record can't initialize!");
return;
}
player = new AudioTrack(AudioManager.STREAM_MUSIC,
SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
RECORDER_AUDIO_ENCODING, Buffer_Size,
AudioTrack.MODE_STREAM);
Log.d(LOG_Audio, "ready for playing music by using audiotrack");
player.setPlaybackRate(SAMPLE_RATE);
byte[] audioBuffer = new byte[Buffer_Size];
Log.d(LOG_Audio, "AudioBuffer created of size " + Buffer_Size);
recorder.startRecording();
Log.d(LOG_Audio, "Start Recording!");
player.play();
Log.d(LOG_Audio, "Start Playing!");
while (isRecording == true) {
//reading data from MIC into buffer
recorder.read(audioBuffer, 0, audioBuffer.length);
player.write(audioBuffer, 0, audioBuffer.length);
//putting buffer in the packet
packet = new DatagramPacket(audioBuffer, audioBuffer.length, destination, port);
socket.send(packet);
Log.d(LOG_NW, "packet sending to " + destination + " with port : " + port);
}
} catch (UnknownHostException e) {
Log.d(LOG_Audio, "UnknownHostException");
} catch (IOException e) {
Log.d(LOG_Audio, "IOException");
}
}
}); // end of recordingThread
recordingThread.start();
}
、これはPythonのサーバーコードです。
import socket
import numpy as np
import matplotlib.pyplot as plt
IP = "192.168.0.4"
server_address = (IP, 7979)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
buffer_size = 3584
server.bind(server_address)
i = True
while(i):
print "Listening...\n"
packet, client = server.recvfrom(buffer_size)
#Convert packet to numpy array
signal = np.fromstring(packet, dtype=np.int16)
i=False
server.close()
このPythonコードでは、1つのパケットしか受信されません。
しかし、その後、私はいくつかのパケットを受信するためにリストを作ります。
は私が64msのサイズがあるフレーム(時間を!)ウィンドウとFFT(高速フーリエ変換)のためにしたいが、問題は、パケットが3584バイトです。
は、だから私は、ウィンドウやPythonのサーバーにアンドロイドからバイトのパケットでFFTを行う方法がわかりません。
は、どのように私は時間の長さを使用してフレームを作ることができますか?
パケットは3584バイトです。なぜFFTが問題になるのですか?パケットの長さを2の累乗にしますか?そして、あなたはそれをパディングとテーパリングによって達成したいのですか?それは窓ガラスのことですか?申し訳ありませんが、すべてのこれらの質問が、私は正確に何が問題なのかよく分かりません。 –
ご意見ありがとうございます。さて、私はちょうど1つのパケットを受信しましたが、私はwindowingとfftを実行するために、より多くのパケットを受信したいと思います。問題は、私は64ミリメートルの長さを持っているフレームを持っているべきだと思うが、私は3584バイトの長さを持つパケットを持っています。だから私はどのようにウィンドウ処理を実行するのか分からない。 –