我正在设置新的ASR服务器。音频数据来自客户端,音频数据格式为int16数组(PCM数据),应在ASR服务器引擎之前将其更改为vector<float>
。
我尝试了很多次,但是编译器错误发生如下:
error: invalid conversion from ‘int’ to kaldi::MatrixResizeType’ [-fpermissive] error: ‘vector’ was not declared in this scope wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes)); //testing; error: missing template arguments before ‘(’ token Vector wave_data = Vector(pcm_bytes, pcm_bytes + sizeof(pcm_bytes) / sizeof(pcm_bytes[0])); //testing;
请告诉我如何将数组更改为向量(int16浮点型)而不会发生编译错误。
我的源文件:
BaseFloat pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2];
opus_int16 out[MAX_FRAME_SIZE*CHANNELS]; //opus_int16
/* Convert to little-endian ordering. */
for(int i=0; i<CHANNELS*userinfo->asr_session_data->frame_size; i++)
{
//pcm_byte
pcm_bytes[2*i]=(BaseFloat)(out[i]&0xFF);
pcm_bytes[2*i+1]=(BaseFloat)((out[i]>>8)&0xFF);
}
//vector init
Vector<BaseFloat> wave_data(CHANNELS*userinfo->asr_session_data->frame_size,0);
*wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes));* //testing; -> **error happend this line**
我的向量头文件:
template<typename Real>
class Vector: public VectorBase<Real> {
public:
/// Constructor that takes no arguments. Initializes to empty.
Vector(): VectorBase<Real>() {}
/// Constructor with specific size. Sets to all-zero by default
/// if set_zero == false, memory contents are undefined.
explicit Vector(const MatrixIndexT s,
MatrixResizeType resize_type = kSetZero)
: VectorBase<Real>() { Resize(s, resize_type); }
/// Copy constructor from CUDA vector
/// This is defined in ../cudamatrix/cu-vector.h
template<typename OtherReal>
explicit Vector(const CuVectorBase<OtherReal> &cu);
/// Copy constructor. The need for this is controversial.
Vector(const Vector<Real> &v) : VectorBase<Real>() { // (cannot be explicit)
Resize(v.Dim(), kUndefined);
this->CopyFromVec(v);
}
/// Copy-constructor from base-class, needed to copy from SubVector.
explicit Vector(const VectorBase<Real> &v) : VectorBase<Real>() {
Resize(v.Dim(), kUndefined);
this->CopyFromVec(v);
}
/// Type conversion constructor.
template<typename OtherReal>
explicit Vector(const VectorBase<OtherReal> &v): VectorBase<Real>() {
Resize(v.Dim(), kUndefined);
this->CopyFromVec(v);
}
// Took this out since it is unsafe : Arnab
// /// Constructor from a pointer and a size; copies the data to a location
// /// it owns.
// Vector(const Real* Data, const MatrixIndexT s): VectorBase<Real>() {
// Resize(s);
// CopyFromPtr(Data, s);
// }
/// Swaps the contents of *this and *other. Shallow swap.
void Swap(Vector<Real> *other);
/// Destructor. Deallocates memory.
~Vector() { Destroy(); }
};
答案 0 :(得分:0)
在线
*wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes));
vector
显然是指std::vector
(可能某处有using namespace std;
-一个坏主意,但经常发生)。 std::vector
是标准模板,需要指定元素类型(例如,使用vector<int>(...)
或vector<float>(...)
。
但是在代码中没有指定类型;这就是错误的意思。
注意:C ++ 17为构造函数添加了模板参数推导,因为错误消息看起来您的编译器尚不支持。
此外,类Vector
(请注意大写字母V
)似乎没有接受std::vector
的构造函数,除非VectorBase
具有非显式构造函数接受std::vector
。