diff --git a/cycle_gan/protos/audio_pb2.py b/cycle_gan/protos/audio_pb2.py index e4c6f3abf0..8badea7a13 100644 --- a/cycle_gan/protos/audio_pb2.py +++ b/cycle_gan/protos/audio_pb2.py @@ -19,7 +19,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( name='protos/audio.proto', package='voder_audio', syntax='proto3', - serialized_pb=_b('\n\x12protos/audio.proto\x12\x0bvoder_audio\"\x84\x01\n\x12VocodeAudioRequest\x12\x13\n\x0b\x66loat_audio\x18\x01 \x03(\x02\x12\x13\n\x0bsample_rate\x18\x02 \x01(\x05\x12\x13\n\x0bskip_vocode\x18\x03 \x01(\x08\x12\x12\n\nsave_files\x18\x04 \x01(\x08\x12\x1b\n\x13\x62uffer_size_minimum\x18\x05 \x01(\x05\"*\n\x13VocodeAudioResponse\x12\x13\n\x0b\x66loat_audio\x18\x01 \x03(\x02\x62\x06proto3') + serialized_pb=_b('\n\x12protos/audio.proto\x12\x0bvoder_audio\"\x99\x01\n\x12VocodeAudioRequest\x12\x13\n\x0b\x66loat_audio\x18\x01 \x03(\x02\x12\x13\n\x0bsample_rate\x18\x02 \x01(\x05\x12\x13\n\x0bskip_vocode\x18\x03 \x01(\x08\x12\x12\n\nsave_files\x18\x04 \x01(\x08\x12\x1b\n\x13\x62uffer_size_minimum\x18\x05 \x01(\x05\x12\x13\n\x0boutput_rate\x18\x06 \x01(\x05\"*\n\x13VocodeAudioResponse\x12\x13\n\x0b\x66loat_audio\x18\x01 \x03(\x02\x62\x06proto3') ) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -68,6 +68,13 @@ _VOCODEAUDIOREQUEST = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='output_rate', full_name='voder_audio.VocodeAudioRequest.output_rate', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -81,7 +88,7 @@ _VOCODEAUDIOREQUEST = _descriptor.Descriptor( oneofs=[ ], serialized_start=36, - serialized_end=168, + serialized_end=189, ) @@ -111,8 +118,8 @@ _VOCODEAUDIORESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=170, - serialized_end=212, + serialized_start=191, + serialized_end=233, ) DESCRIPTOR.message_types_by_name['VocodeAudioRequest'] = _VOCODEAUDIOREQUEST diff --git a/cycle_gan/sidecar.py b/cycle_gan/sidecar.py index c9fa2831d0..5bff4c115f 100755 --- a/cycle_gan/sidecar.py +++ b/cycle_gan/sidecar.py @@ -125,7 +125,7 @@ def temp_file_name(suffix='.wav'): name = os.path.basename(temp_file.name) return os.path.join(TEMP_DIR.name, name) -def convert(audio, skip_vocode = False, save_files = False, source_rate = 44100): +def convert(audio, skip_vocode = False, save_files = False, source_rate = 44100, output_rate = 44100): #audio = np.array(audio, dtype=np.int16) #audio = np.array(audio, dtype=np.float32) audio = np.array(audio, dtype=np.float32) @@ -138,12 +138,13 @@ def convert(audio, skip_vocode = False, save_files = False, source_rate = 44100) print('----- Original wav file out: {}'.format(filename)) scipy.io.wavfile.write(filename, source_rate, audio) - audio = librosa.resample(audio, source_rate, 16000) - - if save_files: - filename = temp_file_name('.wav') - print('----- Downsampled file out: {}'.format(filename)) - scipy.io.wavfile.write(filename, 16000, audio) + if source_rate != 16000: + print("Resampling audio from {} Hz to 16000 Hz".format(source_rate)) + audio = librosa.resample(audio, source_rate, 16000) + if save_files: + filename = temp_file_name('.wav') + print('----- Downsampled file out: {}'.format(filename)) + scipy.io.wavfile.write(filename, 16000, audio) if skip_vocode: return audio @@ -152,13 +153,12 @@ def convert(audio, skip_vocode = False, save_files = False, source_rate = 44100) #results = audio[:] #consume_rate = 68000 # Experimentally determined for Rust lib 'CPAL' - consume_rate = 44100 - upsampled = librosa.resample(results, 16000, consume_rate) + upsampled = librosa.resample(results, 16000, output_rate) if save_files: filename = temp_file_name('.wav') print('----- Upsampled (transformed) file out: {}'.format(filename)) - scipy.io.wavfile.write(filename, consume_rate, upsampled) + scipy.io.wavfile.write(filename, output_rate, upsampled) return upsampled @@ -185,12 +185,15 @@ def main(): #results = queue[:] results = convert(queue, source_rate = vocode_request.sample_rate, + output_rate = vocode_request.output_rate, skip_vocode = vocode_request.skip_vocode, save_files = vocode_request.save_files) queue = [] - layout = '<' + ('f' * len(results)) - result_bytes = struct.pack(layout, *results) - socket.send(result_bytes) + + vocode_response = VocodeAudioResponse() + vocode_response.float_audio[:] = results + + socket.send(vocode_response.SerializeToString()) else: # Must send reply back to client socket.send(b"OK") diff --git a/protos/audio.proto b/protos/audio.proto index be1b9699d8..830d1e7f61 100644 --- a/protos/audio.proto +++ b/protos/audio.proto @@ -12,9 +12,11 @@ message VocodeAudioRequest { // How big we let the buffer grow before running 'convert'. int32 buffer_size_minimum = 5; + + // Requested output rate + int32 output_rate = 6; } message VocodeAudioResponse { repeated float float_audio = 1; } - diff --git a/src/main.rs b/src/main.rs index 8e91ab61a3..4e5de33dab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -102,6 +102,7 @@ fn run_cpal_audio() -> Result<(), failure::Error> { let mut vocode_request = VocodeAudioRequest::default(); vocode_request.sample_rate = 16000; + vocode_request.output_rate = 16000; vocode_request.skip_vocode = true; vocode_request.save_files = false; vocode_request.buffer_size_minimum = 100000; @@ -162,12 +163,13 @@ fn run_cpal_audio() -> Result<(), failure::Error> { //println!("---> Buf len: {}", buf.len()); if buf.len() > 2 { // Receive data condition. - let mut cur = Cursor::new(buf); + let vocode_response = VocodeAudioResponse::decode(buf).unwrap(); + /*let mut cur = Cursor::new(buf); let mut floats : Vec = Vec::new(); while let Ok(val) = cur.read_f32::() { floats.push(val); - } - post_process_queue.extend(floats); + }*/ + post_process_queue.extend(vocode_response.float_audio); } }, Err(e) => { diff --git a/src/protos/voder_audio.rs b/src/protos/voder_audio.rs index 16bb1d8466..e521b79b86 100644 --- a/src/protos/voder_audio.rs +++ b/src/protos/voder_audio.rs @@ -13,6 +13,9 @@ pub struct VocodeAudioRequest { /// How big we let the buffer grow before running 'convert'. #[prost(int32, tag="5")] pub buffer_size_minimum: i32, + /// Requested output rate + #[prost(int32, tag="6")] + pub output_rate: i32, } #[derive(Clone, PartialEq, ::prost::Message)] pub struct VocodeAudioResponse {