| Index: webrtc/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
|
| diff --git a/webrtc/modules/audio_processing/intelligibility/test/intelligibility_proc.cc b/webrtc/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
|
| index ab8524bb0028de2f9f5e9cb1e3b9b39534a2e7a5..e196e29436e4ee6c7e28b98797e8653662f3be54 100644
|
| --- a/webrtc/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
|
| +++ b/webrtc/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
|
| @@ -8,17 +8,10 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -//
|
| -// Command line tool for speech intelligibility enhancement. Provides for
|
| -// running and testing intelligibility_enhancer as an independent process.
|
| -// Use --help for options.
|
| -//
|
| -
|
| -#include <sys/stat.h>
|
| -
|
| #include "gflags/gflags.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "webrtc/base/criticalsection.h"
|
| +#include "webrtc/common_audio/channel_buffer.h"
|
| #include "webrtc/common_audio/include/audio_util.h"
|
| #include "webrtc/common_audio/wav_file.h"
|
| #include "webrtc/modules/audio_processing/audio_buffer.h"
|
| @@ -40,62 +33,45 @@ void void_main(int argc, char* argv[]) {
|
| "\n\nInput files must be little-endian 16-bit signed raw PCM.\n");
|
| google::ParseCommandLineFlags(&argc, &argv, true);
|
|
|
| - // Load settings and wav input.
|
| - struct stat in_stat, noise_stat;
|
| - ASSERT_EQ(stat(FLAGS_clear_file.c_str(), &in_stat), 0)
|
| - << "Empty speech file.";
|
| - ASSERT_EQ(stat(FLAGS_noise_file.c_str(), &noise_stat), 0)
|
| - << "Empty noise file.";
|
| -
|
| - const size_t samples = std::min(in_stat.st_size, noise_stat.st_size) / 2;
|
| -
|
| WavReader in_file(FLAGS_clear_file);
|
| - std::vector<float> in_fpcm(samples);
|
| - in_file.ReadSamples(samples, &in_fpcm[0]);
|
| - FloatS16ToFloat(&in_fpcm[0], samples, &in_fpcm[0]);
|
| -
|
| WavReader noise_file(FLAGS_noise_file);
|
| - std::vector<float> noise_fpcm(samples);
|
| - noise_file.ReadSamples(samples, &noise_fpcm[0]);
|
| - FloatS16ToFloat(&noise_fpcm[0], samples, &noise_fpcm[0]);
|
| -
|
| - // Run intelligibility enhancement.
|
| + WavWriter out_file(FLAGS_out_file, in_file.sample_rate(),
|
| + in_file.num_channels());
|
| IntelligibilityEnhancer enh(in_file.sample_rate(), in_file.num_channels());
|
| rtc::CriticalSection crit;
|
| NoiseSuppressionImpl ns(&crit);
|
| ns.Initialize(noise_file.num_channels(), noise_file.sample_rate());
|
| ns.Enable(true);
|
| -
|
| - // Mirror real time APM chunk size. Duplicates chunk_length_ in
|
| - // IntelligibilityEnhancer.
|
| - size_t fragment_size = in_file.sample_rate() / 100;
|
| - AudioBuffer capture_audio(fragment_size, noise_file.num_channels(),
|
| - fragment_size, noise_file.num_channels(),
|
| - fragment_size);
|
| - StreamConfig stream_config(in_file.sample_rate(), noise_file.num_channels());
|
| -
|
| - // Slice the input into smaller chunks, as the APM would do, and feed them
|
| - // through the enhancer.
|
| - float* clear_cursor = &in_fpcm[0];
|
| - float* noise_cursor = &noise_fpcm[0];
|
| -
|
| - for (size_t i = 0; i < samples; i += fragment_size) {
|
| - capture_audio.CopyFrom(&noise_cursor, stream_config);
|
| + const size_t in_samples = noise_file.sample_rate() / 100;
|
| + const size_t noise_samples = noise_file.sample_rate() / 100;
|
| + std::vector<float> in(in_samples * in_file.num_channels());
|
| + std::vector<float> noise(noise_samples * noise_file.num_channels());
|
| + ChannelBuffer<float> in_buf(in_samples, in_file.num_channels());
|
| + ChannelBuffer<float> noise_buf(noise_samples, noise_file.num_channels());
|
| + AudioBuffer capture_audio(noise_samples, noise_file.num_channels(),
|
| + noise_samples, noise_file.num_channels(),
|
| + noise_samples);
|
| + StreamConfig stream_config(noise_file.sample_rate(),
|
| + noise_file.num_channels());
|
| + while (in_file.ReadSamples(in.size(), in.data()) == in.size() &&
|
| + noise_file.ReadSamples(noise.size(), noise.data()) == noise.size()) {
|
| + FloatS16ToFloat(in.data(), in.size(), in.data());
|
| + FloatS16ToFloat(noise.data(), noise.size(), noise.data());
|
| + Deinterleave(in.data(), in_buf.num_frames(), in_buf.num_channels(),
|
| + in_buf.channels());
|
| + Deinterleave(noise.data(), noise_buf.num_frames(), noise_buf.num_channels(),
|
| + noise_buf.channels());
|
| + capture_audio.CopyFrom(noise_buf.channels(), stream_config);
|
| ns.AnalyzeCaptureAudio(&capture_audio);
|
| ns.ProcessCaptureAudio(&capture_audio);
|
| enh.SetCaptureNoiseEstimate(ns.NoiseEstimate());
|
| - enh.ProcessRenderAudio(&clear_cursor, in_file.sample_rate(),
|
| + enh.ProcessRenderAudio(in_buf.channels(), in_file.sample_rate(),
|
| in_file.num_channels());
|
| - clear_cursor += fragment_size;
|
| - noise_cursor += fragment_size;
|
| + Interleave(in_buf.channels(), in_buf.num_frames(), in_buf.num_channels(),
|
| + in.data());
|
| + FloatToFloatS16(in.data(), in.size(), in.data());
|
| + out_file.WriteSamples(in.data(), in.size());
|
| }
|
| -
|
| - FloatToFloatS16(&in_fpcm[0], samples, &in_fpcm[0]);
|
| -
|
| - WavWriter out_file(FLAGS_out_file,
|
| - in_file.sample_rate(),
|
| - in_file.num_channels());
|
| - out_file.WriteSamples(&in_fpcm[0], samples);
|
| }
|
|
|
| } // namespace
|
|
|