当前位置:首页 » 操作系统 » htk源码

htk源码

发布时间: 2022-03-05 16:46:57

① 语音识别sdk支持的音频格式,采样率有哪些

1、用audioread('');函数读取电脑音频文件参数音频文件路径:
[sampledata,FS] = audioread('F:1.mp3');
sampledata保存音频信号数据FS音频采率MP3格式采率般44100;

2、判断音频数据否双声道双声道则保留声道数据用calsample.m文件函数完功能文件内容:

function sample = calsample(sampledata,FS)
temp_sample = resample(sampledata,1,FS/11025);
[m,n] = size(temp_sample);
if (n == 2)
sample = temp_sample(:,1);
else
sample = temp_sample;
end
end

② htk训练gmm模型时怎么配置proto

要看具体变量的类型,看个例子吧:
在网络游戏中,游戏玩家之间的同步是一个最基本的功能,而同步是通过对坐标的广播进行的,因此我们假设一个简单的模型,当一个玩家的位置发生变化时,将玩家的新位置发给地图内所有玩家,根据这个情况写出以下proto文件。

message PlayerPos{
required uint32 playerID = 1;
required float posX = 2 ;
required float posY = 3 ;
}
这样就有一个问题,现在的游戏都是3D游戏,因此需要xyz来表示位置,还需要另一组xyz来表示朝向,如果用简单变量的话就会显的很乱,而且无论是位置还是朝向其实都是一组xyz,因此可以将xyz抽出来成为一个复合数据类型,单独放在一个文件中。这样就构成以下文件。

file vector.proto

message vector3D{
required float x = 1;
required float y = 2;
required float z = 3;
};

file Player.proto

import "vector.proto";

message PlayerPos {
required uint32 playerID = 1;
required vector3D pos = 2;
};

编译的时候先编译vector文件,采用import时需要注意路径,本例中两文件在同一目录下。

protoc --cpp_out=. vector.proto Player.proto

proto对应的文件已经生成了,但是该怎么赋值呢,查API查了半天有点不知所以,干脆来看生成的类文件的源代码吧

// required uint32 playerID = 1;
inline bool has_playerid() const;
inline void clear_playerid();
static const int kPlayerIDFieldNumber = 1;
inline ::google::protobuf::uint32 playerid() const;
inline void set_playerid(::google::protobuf::uint32 value);

// required .vector3D pos = 2;
inline bool has_pos() const;
inline void clear_pos();
static const int kPosFieldNumber = 2;
inline const ::vector3D& pos() const;
inline ::vector3D* mutable_pos();
inline ::vector3D* release_pos();
inline void set_allocated_pos(::vector3D* pos);

上面列出了生成的部分源代码,主要是PlayerPos的操作变量的函数,第一个playID很简单,可以看到直接使用set_playerid ( ) 即可,但是对于嵌套的pos 发现没有对应的set_pos方法,不过发现了一个set_allocated_pos() 函数,这个函数也是set开头的,看看这个函数是干嘛的。

inline void PlayerPos::set_allocated_pos(::vector3D* pos) {
delete pos_;
pos_ = pos;
if (pos) {
set_has_pos();
} else {
clear_has_pos();
}
}

看上去可以赋值,直接调用set_allocated_pos() 进行赋值看一看

PlayerPos player;
vector3D tmp;
tmp.x = 1;
tmp.y = 2;
tmp.z = 3;
player.set_allocated_pos(&tmp)

编译没问题,但是运行时出现错误,而且是很奇怪的错误,仔细了查看一下PlayerPos的源码,发现一个问题

::vector3D* pos_;
::google::protobuf::uint32 playerid_;

上面是PlayerPos中变量的保存形式,发现pos是作为一个指针存储的,如果按照之前的赋值 tmp 是一个局部变量,函数返回时局部变量自动销毁,而pos_保存的仍然是已被销毁的tmp的位置,因此会出错,如果采用new的话就可以解决这个问题,即赋值方法如下

PlayerPos player;
vector3D *tmp = new Vector3D;
tmp->x = 1;
tmp->y = 2;
tmp->z = 3;
player.set_allocated_pos(tmp)

这样即可,编译运行都没有问题。

如此之外,还有一种赋值方法,就是调用mutable_pos()

inline ::vector3D* PlayerPos::mutable_pos() {
set_has_pos();
if (pos_ == NULL) pos_ = new ::vector3D;
return pos_;
}

mutable_pos () 中自己new出了一个vector3D 对象,而vector3D中又实现了赋值的重载,因此可以这样解决

PlayerPos player;
vector3D *tmp = player.mutable_pos();
tmp->x = 1;
tmp->y = 2;
tmp->z = 3;

热点内容
私有云存储加密 发布:2024-11-12 08:47:21 浏览:117
oracle数据库表数据恢复 发布:2024-11-12 08:41:05 浏览:150
郑州云服务器分销商 发布:2024-11-12 08:30:10 浏览:601
tomcat访问限制 发布:2024-11-12 08:28:04 浏览:936
信息技术的存储设备 发布:2024-11-12 08:25:45 浏览:418
台球拍怎么配置才好 发布:2024-11-12 08:25:44 浏览:641
怎么编译单个java文件 发布:2024-11-12 08:21:02 浏览:888
高通8653和765哪个配置高 发布:2024-11-12 07:57:24 浏览:432
企业焊接人员如何配置 发布:2024-11-12 07:44:53 浏览:759
SQL注入kali 发布:2024-11-12 07:34:49 浏览:192