You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.8 KiB
58 lines
1.8 KiB
// Copyright 2017 Mobvoi Inc. All Rights Reserved.
|
|
// Author: shtxie@mobvoi.com (Shoutao Xie)
|
|
|
|
#ifndef SDS_UTILS_WAV_UTILS_H_
|
|
#define SDS_UTILS_WAV_UTILS_H_
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "types.h"
|
|
|
|
namespace mobvoi {
|
|
namespace sds {
|
|
|
|
struct WavHeader {
|
|
uint8 riff[4]; // RIFF Header Magic header
|
|
uint32 chunk_size; // RIFF Chunk Size
|
|
uint8 wave[4]; // WAVE Header
|
|
uint8 fmt[4]; // FMT header
|
|
uint32 subchunk1_size; // Size of the fmt chunk
|
|
uint16 audio_format; // Audio format 1=PCM,6=mulaw,7=alaw,257=IBM
|
|
// Mu-Law, 258=IBM A-Law, 259=ADPCM
|
|
uint16 channel_num; // Number of channels 1=Mono 2=Stereo
|
|
uint32 samples_per_sec; // Sampling Frequency in Hz
|
|
uint32 bytes_per_sec; // bytes per second
|
|
uint16 block_align; // 2=16-bit mono, 4=16-bit stereo
|
|
uint16 bits_per_sample; // Number of bits per sample
|
|
uint8 subchunk2_id[4]; // "data" string
|
|
uint32 subchunk2_size; // Sampled data length
|
|
};
|
|
|
|
typedef int (*audio_send_func)(const char* frame, int size);
|
|
|
|
double GetWavDurationMs(const std::string& wav_file);
|
|
bool ReadWavPcmData(const std::string& wav_file, std::vector<char>* out);
|
|
void ConvertPCMToWAV(const std::string& pcm,
|
|
std::string* wav,
|
|
const int channel = 1,
|
|
const int rate = 16000,
|
|
const int bit_depth = 16);
|
|
|
|
class AudioSender {
|
|
public:
|
|
AudioSender(int interval_ms, const std::string& audio_file,
|
|
audio_send_func audio_handler);
|
|
void StreamingSend();
|
|
void DirectlySend();
|
|
|
|
private:
|
|
int interval_ms_;
|
|
std::vector<char> audio_bytes_;
|
|
audio_send_func audio_handler_;
|
|
};
|
|
|
|
} // namespace sds
|
|
} // namespace mobvoi
|
|
|
|
#endif // SDS_UTILS_WAV_UTILS_H_
|
|
|