Blog Archive

Friday, July 27, 2018

Best lines from the movie "Lost in Space"

Whatever created it,it's from the top of food chain, an apex predator.

There is time to follow your heart, there is time to follow your head.

History books are full of stories of heroic men and heir sacrifices, but do you know who writes those stories? The survivors.

Impossible happens all the time, just believe it can.

Wednesday, July 25, 2018

音频指纹技术在车载娱乐系统中的应用

 Link

音频指纹检索是人工智能领域自动内容识别技术(Automatic content recognition)的核心算法,与语音识别(如科大讯飞,Nuance)将一段用户的语音转化为文字不同,音频指纹技术不区分语言,是一种声音对声音的精确检索。通过对声音产生的音频指纹匹配,将一段声音中的内容与内容库中的内容做比对,精确识别出库中对应的内容以及对应内容的所在位置。在现实应用中,音频指纹技术广泛应用于歌曲的识别如“听歌识曲”,
电台,电视台内容监测和手机第二屏互动领域。但音频指纹技术在车载领域的应用却很少被大家所熟知。其实如果留意车载娱乐系统,很多知名的汽车品牌如宝马,丰田,福特,特斯拉,都已将音乐识别技术内置于车载的媒体管理系统,用于提高车主在驾驶中的娱乐体验和信息检索的安全性。以下是现实中车载音乐识别的一些使用场景:
一. 车载听歌识曲
开车的途中,无论是传统、网络电台,手机蓝牙设备中播放的歌曲,用户只需通过触发,即可通过车载麦克风进行录音识别,通常仅需3-7秒钟,即可识别出歌曲的信息。在一些车连网手机应用中,识别到的歌曲还可被推送到用户手机,并提供流媒体音乐的链接,车主可一键收藏和播放识别到的音乐。
识别的歌曲通过蓝牙推送到手机APP
获得2015年红点设计奖的英国车载品牌Pure,将听歌识曲功能集成至设备中,用户可一键识别电台播放的音乐并将歌曲相关信息推送到Pure的手机APP中。同时在APP中Pure提供一键链接,用户可将喜欢的歌曲添加到流媒体服务如Spotify中。
荣威RX5 YunOS通过主动触发,识别环境中的音乐
2016年上汽荣威与阿里联合发布的首款互联网汽车RX5 YUN
OS版中,当用户在电台收听到自己喜欢的音乐时,可以通过听歌识曲功能一键识别并保存当前播放的歌曲。
二. 实时电台播放歌曲展示
电台播放的音乐是车主获知最新,最热音乐的主要渠道。音频指纹技术应用于传统电台,卫星电台和网络电台中,可在电台播放中自动识别到播放的歌曲并将歌曲的信息呈现在屏幕上。此功能进一步降低驾驶者主动触发识别在开车中的干扰,并实时了解电台中的歌曲信息。
三. 歌曲文件ID3信息补全
通过蓝牙和USB连接至车机的音乐文件如果是CD转入或网络下载的,通常会缺失或误报歌曲的相关信息。通过音频文件中的指纹特征比对,音乐识别技术可将歌曲的ID3信息补全和更正。因而准确的歌曲和专辑信息可被呈现在车机屏幕上。
四. 音乐流派分类
一个用户下载,收藏的歌曲通常有几十首到上万s之间。如何在驾驶的同时查找收听某一类型的歌曲从来都不是一件容易的事。然后通过音频指纹技术可将识别出的歌曲根据metadata中的流派分类,用户只需根据歌曲类型如“摇滚”即可浏览当前所有的摇滚歌曲。
马自达3 2016款将用户USB中的歌曲按流派分类
五. 电台歌曲推送
通过音频指纹技术对电台在服务器端的监控,电台中播放的节目,广告和音乐可以通过推送的方式呈现给用户。当用户刚刚切到一个喜欢的节目但节目马上就结束的时候,通过音频指纹的监控技术,可将完整节目的录音推送给用户以供回听。同时电台中播放的广告和音乐如果用户感兴趣,也可一键保存下来。电台过去播放的节目和内容也可通过音频指纹监控的播放数据统计出来。
识别出的内容按节目,广告和音乐分类呈现在手机应用中
澳洲车载应用Airshr与本地电台合作,车主在行驶中听到自己感兴趣的内容,只需一键点击,即可识别出正在收听的内容。如是音乐,可识别出音乐相关信息;如是广告,则提供广告信息以及店铺位置,优惠券等促销信息。如是节目,则提供节目的完整录音,即使刚听,节目就结束了,也可在稍后收到手机推送的完整节目录音。用户识别和互动的数据还服务于电台的收听调研,便于广播公司针对收听群体的节目的改进和推广。
系统集成方案
音频指纹技术在车载领域的对音乐的识别与车载地图导航相似,即可提供离线,在线,和离现在线混合模式。离线解决方案可根据汽车销售的地区将当地最热门的歌曲音频指纹和歌曲信息储存在车机本地,无需网络,即可覆盖大多数的歌曲识别需求。缺点是需要车主对本地曲库升级才可获取到对新歌的支持。在线搜索则无需在车机本地建立内容库和升级,只需很少的网络流量即可完成歌曲搜索。但瓶颈是在网络受限的情况如地库,隧道中则无法使用此功能。除此之外,虽然音频指纹的检索每次耗费的流量很有限,但对于开启音乐自动检索的用户也会带来流量的顾虑。目前音乐识别最好的方法是离线和在线的混合模式,通过本地储存的高频歌曲指纹库来降低在线识别的请求次数,同时在线识别作为补充,可将最新的歌曲识别出来。
伴随车联网和信息检索领域的技术水平升级,在驾驶中如何更好的个性化向用户推荐感兴趣的内容和更便捷的信息检索将成为用户选择一款车的重要衡量标准之一。目前在音乐识别车载解决方案中,美国的Gracenote与整车品牌合作,率先将音频指纹技术应用在欧美日车系中。来自中国的ACRCloud已与众多上述车载设备和汽车tier1和tier2供应商整合,将更好支持中国用户的音乐识别服务方案带入自助品牌和合资品牌中。未来将会有更多的整车品牌和新能源汽车配置音频指纹识别技术。

Monday, July 16, 2018

AI数据服务公司「爱数智慧」完成A轮融资,估值接近两亿元

Link

陈绍元

 • 刚刚 • 人工智能
爱数智慧认为其优势在于,能够为客户提供专业的整体解决方案。
36氪近日获悉,AI数据服务公司「爱数智慧」于今年1月获A轮融资,投资方为策源创投和梅花天使,融资完成后公司估值接近两亿元。爱数智慧曾于2017年初,获得明势资本Pre-A轮融资。
数据、算法、算力是人工智能应用发展背后的三大驱动力,其中数据作为最源头的“生产材料”,其量级大小和是否质优,对最终的算法训练效果会有很大影响。
我们曾于去年报道过爱数智慧,这是一家人工智能大数据处理服务企业,为智能语音、自然语言理解、智能图像等领域的客户,提供整套数据服务,包括数据方案设计、数据采集、数据标注、转写等。
提供AI数据处理服务的公司已有不少,爱数智慧认为其优势在于,能够提供专业的整体解决方案。爱数智慧创始人张晴晴向36氪表示,需要数据处理服务的客户,对自己最终需要什么类型的数据很清晰,但往往不知道该通过什么过程实现目标。而爱数智慧的创始团队有多年算法研究、实践经历,对于如何做数据的设计、采集、标注,以应用于识别模型开发能更有效的提升算法效果有丰富经验
以张晴晴为例,她是中科院声学所语言信号处理博士,法国国家实验室LIMSI-CNRS博士后,中国科学院声学研究所任副教授,曾在微软亚洲研究院进行语音合成声学建模研究。
目前,在智能语音领域,爱数智慧已完成数万小时的自然对话标注、涵盖近二十个城市的车载语音采集、涵盖多个方言区的多环境语音采集等任务。在智能图像领域,完成过多姿态人脸 、智能人脸相册、道路物体画框和道路物体分割等任务。在自然语言处理领域,完成过特定领域问答库构建、实体及情感标注以及机器阅读数据库构建等任务。
除了定制化的数据服务,爱数智慧还基于对行业的积淀,提取共性,制作了标准数据库,以提高服务效率,降低成本。目前其已在自然对话、智能家居、智能车载等垂直应用领域,开发了较成熟的标准数据库产品。
大型客户在选取数据服务商时,往往很费时费力,会考量服务商的解决方案能力、质量把控能力、安全性、效率、价格等多重因素,而一旦合作并认可了服务商,也不愿意轻易更换,所以粘性很高,会产生持续合作
爱数智慧基于此行业特点,很重视自身的品牌建设,通过对头部客户的高质量服务建立自己的行业口碑,以降低更多客户的选择成本。
张晴晴表示,爱数智慧目前建立合作关系的核心企业包括:微软、Nuance、腾讯、中国移动、华为、阿里巴巴、美的、小米、苏宁、滴滴、海康威视、思必驰等。
36氪观察到,随着人工智能行业的成熟度逐渐提高,资金、资源越来越向头部AI公司集中。对于未来数据服务的客户是否会主要集中于AI头部公司的疑问,张晴晴表示,依然会存在很多大型传统企业,他们有很强烈的人工智能转型需求,但不会把自己的数据提供给第三方AI公司,他们更倾向于自己招人进行算法开发。而这部分客户也是爱数智慧未来会重点服务的客户类型之一。
另外36氪还了解到,由于该赛道的客户回款周期普遍较长,大多在3个月~6个月,长的甚至可达一年,所以现金流对于数据服务公司来说非常重要,通常他们会通过融资或贷款的方式缓解。
据爱数智慧提供的数据显示,自2016年6月成立至今,其业务量月环比持续保持三位数以上的增速。目前团队共有近300人,其中全职标注团队约有200人。
提供AI数据处理服务的公司,成立较早的有“数据堂”,已经挂牌新三板。早期公司除了本文介绍的“爱数智慧”,还包括完成天使轮融资的“泛涵科技”,获得两轮融资的 BasicFinder,获得合力投资数百万天使的“丁火智能”,获得两轮融资的“龙猫数据”,获得两轮融资的“星尘数据”等。

Thursday, July 12, 2018

Reading notes about hash function

hash function:
https://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200101/homework10/hashfuncs.html


https://www.rapidtables.com/convert/number/hex-dec-bin-converter.html


Wednesday, July 11, 2018

C++ cheatsheet



template @C++
https://www.tutorialspoint.com/cplusplus/cpp_templates.htm

Tuesday, July 10, 2018

Sorting a vector of custom objects

Reference:
Link
Question: Sorting a vector of custom objects

Answer:


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};


struct less_than_keyP
{
    inline bool operator() (const MyStruct * struct1, const MyStruct * struct2)
    {
        return (struct1->key < struct2->key);
    }
};



int main(){

std::vector < MyStruct > vec;
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));
std::vector < MyStruct *> vecp;
vecp.push_back(&vec[0]);
vecp.push_back(&vec[1]);
vecp.push_back(&vec[2]);
vecp.push_back(&vec[3]);
//std::sort(vec.begin(),  vec.end(),  less_than_key());
std::sort(vecp.begin(), vecp.end(), less_than_keyP());

for(int i=0;i<4;i++){
    cout<<"vecp:" <<  (*vecp[i]).key << " " << vecp[i]->stringValue << endl;
    cout<<"vec:"  <<  vec[i].key << " " << vec[i].stringValue << endl;

}
cout << " ====" << endl;
std::sort(vec.begin(),  vec.end(),  less_than_key());
//std::sort(vecp.begin(), vecp.end(), less_than_keyP());

for(int i=0;i<4;i++){
    cout<<"vecp:" <<  (*vecp[i]).key << " " << vecp[i]->stringValue << endl;
    cout<<"vec:"  <<  vec[i].key << " " << vec[i].stringValue << endl;

}


}

//result:

vecp:1 this
vec:4 test
vecp:2 is
vec:3 a
vecp:3 a
vec:2 is
vecp:4 test
vec:1 this
====
vecp:4 test
vec:1 this
vecp:3 a
vec:2 is
vecp:2 is
vec:3 a
vecp:1 this
vec:4 test

Thursday, July 5, 2018

extern keyword in c++

Abstract:
"extern" keyword has two functions:
1)  extern “C” in C++. When some code is put in extern “C” block, the C++ compiler ensures that the function names are unmangled – that the compiler emits a binary file with their names unchanged, as a C compiler would do.


2)  extend life of a variable/function to span the scope of multiple files.

case 1:

Link

// Save file as .cpp and use C++ compiler to compile it
extern "C"
{
    int printf(const char *format,...);
}
 
int main()
{
    printf("GeeksforGeeks");
    return 0;
}

case 2:

Link

Examples:
extern int i;
declares that there is a variable named i of type int, defined somewhere in the program.
extern int j = 0;
defines a variable j with external linkage; the extern keyword is redundant here.
extern void f();
declares that there is a function f taking no arguments and with no return value defined somewhere in the program; extern is redundant, but sometimes considered good style.
extern void f() {;}
defines the function f() declared above; again, the extern keyword is technically redundant here as external linkage is default.
extern const int k = 1;
defines a constant int k with value 1 and external linkage; extern is required because const variables have internal linkage by default.
extern statements are frequently used to allow data to span the scope of multiple files.