Matrix Voice ESP32: problem with Build and Make


#42

Dear Rom,

this afternoon thanks to my Prof. support we started with C code, but we encountered some problems and it’s a little be hard to explaine:

  1. as you know we need a wave file and at the same time we need few line in C code to insert in the call back to get a 16 bit correct array out; at the moment we can’t get a clean signal. After checking the MatrixVoiceAudioServer file my Prof. believed that might be an error in lines 332-335 because the for re-write 2 times in the same place.

We correctly read the payload but we are not able to rebuild the sampled values array (of a music or sound).

  1. How to rebuild the voice buffer Uint_16?

  2. How to get the original 16 bit array out from message payload?

  3. if you could suggest us few line in C code we are grateful to you

thanks
Salva


#43

Hi there, that is not an error :smiley:

The MatrixVoice has a NumberOfSamples, that is a fixed number of 512. You can look it up here:

const uint16_t kMicarrayBufferSize = 4096;
const uint16_t kMicrophoneChannels = 8;
 uint32_t NumberOfSamples() {
    return kMicarrayBufferSize / kMicrophoneChannels;
  }

So, 4096 / 8 = 512

By default, the Snips framerate is 256. That is, it is expecting 256 samples per MQTT message.
In order to send 1 Mic.Read samples (512), we need to send 2 messages of 256 samples.

If you set CHUNK to 512 (in the #define part at the top of the sketch), the code will produce the payload you expect. Which will be 1 MQTT message per mic.read()

But the problem is most likely in your consuming code, can you show that?


#44

Hi Rom, sorry for delay, I’m back to the Univerisity today, I try to explaine:

  1. My Matrix Voice Esp32 is working in standalone mode
    2)Basing on my needs I’m using this C code to establish a connection between broker/server (PI) and client (Matrix Voice):
    #include <stdio.h>
    #include <mosquitto.h>

    void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
    {
    	if(message->payloadlen){
    		printf("%s %s\n", message->topic, message->payload);
    	}else{
    		printf("%s (null)\n", message->topic);
    	}
    	fflush(stdout);
    }

    void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
    {
    	int i;
    	if(!result){
    		/* Subscribe to broker information topics on successful connect. */
    		mosquitto_subscribe(mosq, NULL, "hermes/audioServer/matrixvoice/audioFrame", 2);
    	}else{
    		fprintf(stderr, "Connect failed\n");
    	}
    }

    void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos)
    {
    	int i;

    	printf("Subscribed (mid: %d): %d", mid, granted_qos[0]);
    	for(i=1; i<qos_count; i++){
    		printf(", %d", granted_qos[i]);
    	}
    	printf("\n");
    }

    void my_log_callback(struct mosquitto *mosq, void *userdata, int level, const char *str)
    {
    	/* Pring all log messages regardless of level. */
    	printf("%s\n", str);
    }

    int main(int argc, char *argv[])
    {
    	int i;
    	char *host = "localhost";
    	int port = 1883;
    	int keepalive = 60;
    	bool clean_session = true;
    	struct mosquitto *mosq = NULL;

    	mosquitto_lib_init();
    	mosq = mosquitto_new(NULL, clean_session, NULL);
    	if(!mosq){
    		fprintf(stderr, "Error: Out of memory.\n");
    		return 1;
    	}
    	mosquitto_log_callback_set(mosq, my_log_callback);
    	mosquitto_connect_callback_set(mosq, my_connect_callback);
    	mosquitto_message_callback_set(mosq, my_message_callback);
    	mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);

    	if(mosquitto_connect(mosq, host, port, keepalive)){
    		fprintf(stderr, "Unable to connect.\n");
    		return 1;
    	}

    	while(!mosquitto_loop(mosq, -1, 1)){
    	}
    	mosquitto_destroy(mosq);
    	mosquitto_lib_cleanup();
    	return 0;
    }
  1. When I execute I obtain this output:
		
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 	
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~���~��������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~�~���|����{�}�~�}����~����~�}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��������������������������������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame '
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 3
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ����������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ������������������������������������������������������������������������
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 

Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame $
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 

Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 

Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame ��
Client mosq/R<G?FANm=qAOL2SlEr received PUBLISH (d0, q0, r0, m0, 'hermes/audioServer/matrixvoice/audioFrame', ... (512 bytes))
hermes/audioServer/matrixvoice/audioFrame 
  1. I think that it is working, but I don’t know if it is working properly
  2. How to get the original 16 bit array out from message payload?
  3. if you could suggest us few line in C code we are grateful to you

Thanks!


#45

Hi there, that looks correct.
What you log is the binary information from the (small) wave file.
It is 1 small wave file per message, with a samplerate of 16000 stereo. That is was Snips requires.

So @5: you are looking right at it :slight_smile:

What you need to do in your my_message_callback:

void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
   //strip the 44 byte wave header from the payload
  //you now have a raw audio buffer, this is a stereo 16bit audio buffer with a sample rate of 16000Hz
  //I suggest that you create a circular buffer for the audio processing, so push every payload into that buffer
  //pseudo code:
  for (int i=44;i < payload_length;i++) {
      push to circular buffer (payload[i]);
  }
}

In your mainloop, add a function call to your “little system (c++ code) that acquires music and sounds”.
In that function, use the circular buffer to process the audio.
Keep in mind the sampling rate of 16000, when you assume a samplerate of 44100 hz for example, you will be in trouble!!
Your system will not “hear” the correct sound, but probably an unrecognized noise or the sound will be to fast.
I do not know your processing system, so I only give you some pointers.
Audio processing is usually done with circular buffers, also called ringbuffers.
So if your messagehandler fills the buffer and your music and sounds system pulls from that buffer you have a working system. The sampling rate is very, very, very important, the 16bit and sterop is equally important.
In other words: your audio proceshandler should assume the exact audioproperties the buffer is in.

I will post a small python script which in the same way listens to the mqtt stream, but saves is to a wav file. It might be of some help


#46

Copy this code into your matrix_hotword folder and runit like python audiorecorder.py.
I will run until it has received 200 messages and then save it to a wave file

#!/usr/bin/env python

import json
import os
import sys
import wave
import struct
import collections

from socket import error as socket_error

import paho.mqtt.client as mqtt

from SnipsMqttServer import SnipsMqttServer
sys.path.append('')

class AudioBuffer(object):
    def __init__(self, size = 4096):
        self._buf = collections.deque(maxlen=size)

    def extend(self, data):
        self._buf.extend(data)

    def get(self):
        tmp = bytes(bytearray(self._buf))
        self._buf.clear()
        return tmp

class SnipsHotwordServer(SnipsMqttServer):

    def __init__(self,
                 mqtt_hostname=os.environ.get('mqtt_hostname','192.168.178.81'),
                 mqtt_port=os.environ.get('mqtt_port',1883),
                 listen_to=os.environ.get('hotword_listen_to','default'),
                 ):
        SnipsMqttServer.__init__(self,mqtt_hostname,mqtt_port)

        self.subscribe_to='hermes/hotword/toggleOff,hermes/hotword/toggleOn,hermes/audioServer/default/playBytes/#'
        self.listen_to = listen_to
        self.clientList = []
        self.allowedClientList = listen_to.split(',')

        self.client_buffer = {}
        self.client_recognition = {}
        self.client_talking = {}
        self.record = {}

        self.messageCount = 0;

        for client in self.allowedClientList:
            self.client_buffer[client] = AudioBuffer(1 * 16000 * 20)
            self.client_recognition[client] =  AudioBuffer(1 * 16000 * 2)
            self.client_talking[client] = False
            self.record[client] = False

#    def set_everloop_color(self, red, green, blue, white):
#        color_array = bytearray()
#        for x in range(0,34):
#            color_array += bytearray([red, green, blue, white])
#        with open('/dev/matrixio_everloop','wb') as bin_file:
#            bin_file.write(color_array)
#        bin_file.close()

    def on_connect(self, client, userdata, flags, result_code):
        SnipsMqttServer.on_connect(self,client,userdata,flags,result_code)
        # enable to start
        for site in self.allowedClientList:
            self.client.publish('hermes/hotword/toggleOn', payload="{\"siteId\":\"" + site + "\",\"sessionId\":null}", qos=0)
    def on_message(self, client, userdata, msg):
        if msg.topic.endswith('toggleOff'):
            try:
                msgJSON = json.loads(msg.payload)
            except:
                pass
            siteId = msgJSON.get('siteId','default')
            for site in self.allowedClientList:
              if site == siteId:
               self.log('{} toggleOff'.format(site))
        elif msg.topic.endswith('toggleOn'):
            msgJSON = {}
            try:
                msgJSON = json.loads(msg.payload)
            except:
                pass
            siteId = msgJSON.get('siteId','default')
            for site in self.allowedClientList:
              if site == siteId:
               self.log('{} toggleOn'.format(site))
        else:
            self.messageCount = self.messageCount + 1;
            data = msg.payload[44:struct.unpack('<L', msg.payload[4:8])[0]]
            data = msg.payload
            self.client_buffer['default'].extend(data)
            if self.messageCount == 200 :
              waveFile = wave.open( 'output.wav', 'wb')
              waveFile.setnchannels(1)
              waveFile.setsampwidth(2)
              waveFile.setframerate(16000)
              waveFile.writeframes(self.client_buffer['default'].get()) 
              waveFile.close()
              self.log('Stopped recording');

    def log(self, message):
        print(message)

server = SnipsHotwordServer()
server.start()

#47

Hi Rom,
so, just to summarize:

  1. I edit my C code and I change

void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
if(message->payloadlen){
printf("%s %s\n", message->topic, message->payload);
}else{
printf("%s (null)\n", message->topic);
}
fflush(stdout);
}

TO:

void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
//strip the 44 byte wave header from the payload
//you now have a raw audio buffer, this is a stereo 16bit audio buffer with a sample rate of 16000Hz
//I suggest that you create a circular buffer for the audio processing, so push every payload into that buffer
//pseudo code:
for (int i=44;i < payload_length;i++) {
push to circular buffer (payload[i]);
}
}

  1. I create a *.py, in my matrix_hotword folder file, and I insert your phyton code.
    I have changed your mqtt_hostname’,'192.168.178.81 to mine and I get this message:

    START
    RUN <bound method SnipsHotwordServer.startMqtt of <main.SnipsHotwordServer instance at 0x765bacb0>>
    Connecting to 192.168.111.6 on port 1883
    Trying to connect to 192.168.111.6 1883
    hermes/hotword/toggleOff,hermes/hotword/toggleOn,hermes/audioServer/default/playBytes/#
    [u’hermes/hotword/toggleOff’, u’hermes/hotword/toggleOn’, u’hermes/audioServer/default/playBytes/#’]
    sub hermes/hotword/toggleOff
    sub hermes/hotword/toggleOn
    sub hermes/audioServer/default/playBytes/#
    Connected with result code 0
    default toggleOn

  2. for information…at the moment I’d like just C file (as shown in MQTT file) that after subscribing your topic get sounds from matrix voice and performing a FFT (of audio input or of a registered audio)

  3. Am I in the right way?


#48
  1. You do not need that py script for your code, that script was just to show you how to check what is coming in from the stream.
    When that py script says stopped recording, you should have an output.wav which is the recording :slight_smile:
    It records 200 message, you can change that to a higher number if you need a longer file

  2. pseudo code = not the actual code but conceptal. You should create the real C code there. Take knowledge of circullar (aka ring) buffers to learn how to process audiodata. Maybe call in some help from you c pro. If your system takes only wave files, save it first.

  3. It is a little hard to see without knowlegde of your c code. I do not not what kind of system you use for that colorchanging stuff. I assume it can work on realtime audiobuffers and not just wav files.
    I also assume you can configure the samplerate from the input. Because my software outputs 16000 Hz. If your code assume 44100Hz, you will never get a clean audio and correct audio strream


#49
  1. Yes you are right, I just want to check *.wav output file…but running your audiorecorder.py (no *.wav files were registered) and we only get this:
    START
    RUN <bound method SnipsHotwordServer.startMqtt of <main.SnipsHotwordServer instance at 0x765c5cb0>>
    Connecting to 192.168.111.6 on port 1883
    Trying to connect to 192.168.111.6 1883
    hermes/hotword/toggleOff,hermes/hotword/toggleOn,hermes/audioServer/default/playBytes/#
    [u’hermes/hotword/toggleOff’, u’hermes/hotword/toggleOn’, u’hermes/audioServer/default/playBytes/#’]
    sub hermes/hotword/toggleOff
    sub hermes/hotword/toggleOn
    sub hermes/audioServer/default/playBytes/#
    Connected with result code 0
    default toggleOn

  2. this is the C code that we are trying to test, compile and build are ok, but after we have executed something gone wrong:

    #include <stdio.h>
    #include <mosquitto.h>
    #include <stdint.h>
    #include <out123.h>

    size_t done = 256;
    out123_handle *ao = NULL;

    void my_message_callback(struct mosquitto *mosq, void userdata, const struct mosquitto_message message)
    {
    if(message->payloadlen){
    /
    printf(“QUESTA MIA %s %s\n”, message->topic, message->payload);
    /
    // uint16_t v[256];
    uint8_t *p = message->payload;
    uint8_t pp = &p[44];
    /

    for (int i=44, j=0; ipayloadlen; i=i+2, j++) {
    v[j] = *((uint16_t *)&p[i]);
    }
    for (int i=0; i<256; i++) {
    printf (" %i", v[i]);
    }
    printf ("\n");
    }
    else{
    printf("%s (null)\n", message->topic);
    }
    fflush(stdout);
    */
    size_t played = out123_play(ao, pp, done);
    if(played != done)
    {
    fprintf(stderr
    , “Warning: written less than gotten from libmpg123: %li != %li\n”
    , (long)played, (long)done);
    }
    }
    }

    void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
    {

     if(!result){
     	/* Subscribe to broker information topics on successful connect. */
     	mosquitto_subscribe(mosq, NULL, "hermes/audioServer/matrixvoice/audioFrame", 2);
     }else{
     	fprintf(stderr, "Connect failed\n");
     }
    

    }

    void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos)
    {
    int i;

     printf("Subscribed (mid: %d): %d", mid, granted_qos[0]);
     for(i=1; i<qos_count; i++){
     	printf(", %d", granted_qos[i]);
     }
     printf("\n");
    

    }

    void my_log_callback(struct mosquitto *mosq, void *userdata, int level, const char str)
    {
    /
    Pring all log messages regardless of level. */
    printf("%s\n", str);
    }

    int main(int argc, char *argv[])
    {

     char *host = "localhost";
     int port = 1883;
     int keepalive = 60;
     bool clean_session = true;
     struct mosquitto *mosq = NULL;
    
     mosquitto_lib_init();
     mosq = mosquitto_new(NULL, clean_session, NULL);
     if(!mosq){
     	fprintf(stderr, "Error: Out of memory.\n");
     	return 1;
     }
     mosquitto_log_callback_set(mosq, my_log_callback);
     mosquitto_connect_callback_set(mosq, my_connect_callback);
     mosquitto_message_callback_set(mosq, my_message_callback);
     mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);
    
     if(mosquitto_connect(mosq, host, port, keepalive)){
     	fprintf(stderr, "Unable to connect.\n");
     	return 1;
     }
     
     
     
     const char *encname;
    
     int channels = 1;
     int encoding = 1;
     int framesize = 1;
     long rate = 0;
     char *driver = NULL;
     char *outfile = NULL;
    
     ao = out123_new();
     
     if(!ao)
     {
     fprintf(stderr, "Cannot create output handle.\n");
     out123_del(ao);
     return -1;
     }
     
     if(out123_open(ao, &driver ,&outfile) != OUT123_OK)
     {
     fprintf(stderr, "Trouble with out123: %s\n", out123_strerror(ao));
     out123_del(ao);
     return -1;
     }
     /*
     encname = out123_enc_name(encoding);
     printf( "Playing with %i channels and %li Hz, encoding %s.\n" , channels, rate, encname ? encname : "???" );
     if( out123_start(ao, 16000, channels, encoding)	|| out123_getformat(ao, NULL, NULL, NULL, &framesize) )
     {
     fprintf(stderr, "Cannot start output / get framesize: %s\n", out123_strerror(ao));
     out123_del(ao);
     return -1;
     }
     */
    
     mosquitto_loop_forever(mosq, -1, 1);
    
     mosquitto_destroy(mosq);
     mosquitto_lib_cleanup();
     return 0;
    

    }

Try to test it if you have few minutes, you have decomment something…

  1. for color changing we use OLA.

thanks


#50

should be hermes/audioServer/matrixvoice/audioFrame, sorry I changed that recently because I was testing something different :wink:
Change that in your py script.

Can you preformat all of the code? Not really readable.


#51
#include <stdio.h>
#include <mosquitto.h>
#include <stdint.h>
#include <out123.h>

size_t done = 256;
out123_handle *ao = NULL;

void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
	if(message->payloadlen){
	/*	printf("QUESTA MIA %s %s\n", message->topic, message->payload);*/
//	uint16_t v[256];
	uint8_t *p = message->payload;
	uint8_t *pp = &p[44];
	/*
		for (int i=44, j=0; i<message->payloadlen; i=i+2, j++) {
			v[j] = *((uint16_t *)&p[i]);
		}
		for (int i=0; i<256; i++) {
		 printf (" %i", v[i]);
		}
			printf ("\n");
		}
	else{
		printf("%s (null)\n", message->topic);
	}
	fflush(stdout);
	*/
	size_t played = out123_play(ao, pp, done);
  if(played != done)
  {
  fprintf(stderr
  , "Warning: written less than gotten from libmpg123: %li != %li\n"
  , (long)played, (long)done);
  }
}
}

void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
	
	if(!result){
		/* Subscribe to broker information topics on successful connect. */
		mosquitto_subscribe(mosq, NULL, "hermes/audioServer/matrixvoice/audioFrame", 2);
	}else{
		fprintf(stderr, "Connect failed\n");
	}
}
void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos)
{
	int i;

	printf("Subscribed (mid: %d): %d", mid, granted_qos[0]);
	for(i=1; i<qos_count; i++){
		printf(", %d", granted_qos[i]);
	}
	printf("\n");
}

void my_log_callback(struct mosquitto *mosq, void *userdata, int level, const char *str)
{
	/* Pring all log messages regardless of level. */
	printf("%s\n", str);
}

int main(int argc, char *argv[])
{
	
	char *host = "localhost";
	int port = 1883;
	int keepalive = 60;
	bool clean_session = true;
	struct mosquitto *mosq = NULL;

	mosquitto_lib_init();
	mosq = mosquitto_new(NULL, clean_session, NULL);
	if(!mosq){
		fprintf(stderr, "Error: Out of memory.\n");
		return 1;
	}
mosquitto_log_callback_set(mosq, my_log_callback);
	mosquitto_connect_callback_set(mosq, my_connect_callback);
	mosquitto_message_callback_set(mosq, my_message_callback);
	mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);

	if(mosquitto_connect(mosq, host, port, keepalive)){
		fprintf(stderr, "Unable to connect.\n");
		return 1;
	}
	
	
	
	const char *encname;

	int channels = 1;
	int encoding = 1;
	int framesize = 1;
	long rate = 0;
	char *driver = NULL;
    char *outfile = NULL;

	ao = out123_new();
	
	if(!ao)
	{
	fprintf(stderr, "Cannot create output handle.\n");
	out123_del(ao);
	return -1;
	}
	
	if(out123_open(ao, &driver ,&outfile) != OUT123_OK)
	{
	fprintf(stderr, "Trouble with out123: %s\n", out123_strerror(ao));
	out123_del(ao);
	return -1;
	}
	/*
	encname = out123_enc_name(encoding);
	printf( "Playing with %i channels and %li Hz, encoding %s.\n" , channels, rate, encname ? encname : "???" );
	if( out123_start(ao, 16000, channels, encoding)	|| out123_getformat(ao, NULL, NULL, NULL, &framesize) )
	{
	fprintf(stderr, "Cannot start output / get framesize: %s\n", out123_strerror(ao));
	out123_del(ao);
	return -1;
	}
	*/

	mosquitto_loop_forever(mosq, -1, 1);

	mosquitto_destroy(mosq);
	mosquitto_lib_cleanup();
	return 0;
}

#52

Rom, I tried your py file and finally MATRIX VOICE ESP32 has registered my voice. I played wav file and the registered voice seems far away. The best thing will be replicate your Python code logic to my C code.


#53

Buffers in the message are bytes, so uint8_t

This part:
for (int i=0; i<256; i++) {
printf (" %i", v[i]);
}
you could use to put those values in a bigger (ring) buffer or save to file as raw audio.


#54

Buffers in the message are bytes, so uint8_t

ok thanks, I change to uint8_t.

you could use to put those values in a bigger (ring) buffer or save to file as raw audio.

are useful links?:


#55

Looks like, be you really should study the principles behind it :slight_smile: