精华内容
下载资源
问答
  • 在回桂林前,飞鸽传书下载帮他和他的同学们去中关村电子市场一口气买了三台电脑,当时最红火的电子市场是中关村电子市场,就是现在北大太平洋电脑商场所在的地方。 每个浏览器背后都有很多U8K8插件,飞鸽传书下载很...

    大哥要回桂林了。在回桂林前,飞鸽传书下载帮他和他的同学们去中关村电子市场一口气买了三台电脑,当时最红火的电子市场是中关村电子市场,就是现在北大太平洋电脑商场所在的地方。

    每个浏览器背后都有很多U8K8插件,飞鸽传书下载很多插件查询的信息相当广泛,功能也相当强大,但我觉得装那么插件没啥用,能获得想要的信息就够了。

    合作伙伴和企业中的工作氛围和工作的角度是完全不同的。合作伙伴是技术型的公司,气氛比较活跃,而且出现头疼的技术问题都比较容易或者有途径去处理。而企业中的系统管理员就不同了,往往就是一个萝卜一个坑,工作气氛也比较严肃,个人的角色也从乙方转换到了甲方。飞鸽传书

    7月份大哥要回桂飞鸽传书下载

    企业即时通讯为什么能够免费?免费是企业即时通讯市场的主流趋势,然而不少企业对此提出质疑。难道天上真会掉下馅饼吗?软件提供商会为一个免费的产品提供至始至终的服务吗?

    飞鸽传书为什么传书?

    微博中直接发布链接地址微博显示的是文本链接,即使该链接出现到“飞鸽传书下载”,用户又有多少的点击呢?由此可见,不利于直接增加。但却有着他另外的一点优越性:是否可以算做一条外链呢?既然搜索引擎将页面索引并显示到结果中,想必应该算作一条外链吧,且还是一条高权重的外链。

    站长你是否曾记得飞鸽传书下载

    站长,你是否曾记得百度在一段时间内出现“飞鸽传书下载”变相排名关键字的现象呢?虽说这项福利并没有持续多久就被磨灭掉了,但着实为不少人某的了利益却是事实。而今天,微博营销的手法再现百度。

    大哥回去后,飞鸽传书下载一个人留在北京,骑着辆破自行车逛了陶瓷最有名的我的:北大和清华,北大风景如画的未名湖上处处荷叶飘香,清华平平展展的草坪展示一种平实坦荡的心胸。一墙之隔,校园内外,就是两种不同气氛,无名无状,却让hongjin2这个二十多岁没出过广西的土包子感受深刻。

    WZ132的发展让越来越多的企业开始重视网络营销,而搜索引擎营销是网络营销中占比最高的,截止2011年上半年,飞鸽传书下载规模为75X7亿元,较2010年下半年增长8X2%。企业重视搜索引擎营销的原因在于,80%以上的上网用户是通过搜索引擎(百度,Google,雅虎等)寻找和获得自身需要的资料和信息;有40%左右只点击搜索结果的前五位就能获得需要的资料和信息。飞鸽传书

    这时hongji飞鸽传书下载

    这时,hongjin2还在一家私营公司里打工,于是,白天上班,晚上就挑灯夜战,每晚不到12点不休息。经过半年的复习,hongjin2参加了1997年元月的整个网站研究生入学考试,成绩出来,飞鸽传书下载专业课没问题,但数学才得了44分,毫无疑问,名落孙山。

    飞鸽传书下载,还是飞鸽传书下载

    hongjin2决定,从今往后,如果hongjin2有能力帮助别人的,就一定要帮助人。这世界充满了太多不好的东西,飞鸽传书下载应该努力往其中添一点好的东西,哪怕显得多么微不足道“土包子”的北京之行刚好,1997年hongjin2大哥在北京中央美院进修美术,hongjin2决定明年继续考研,于是辞去了在一家私营电脑公司的工作,于6月底来到了北京,住进了大哥的宿舍中。

    研究飞鸽传书

    那我想,以后再换其他的工作,不管是甲方还是乙方,也许我都能够坦然的接受,没有什么不能适应的。一些事情只有接受和经历它了之后,才会真正明白一些道理。

    展开全文
  • 当今比较流行的seq2seq基本都是用lstm组成的编码器解码器模型实现,开源的实现大都基于one-hot的embedding(没有词向量表达的信息量大),因此打算自己实现一个基于word2vec...下载《甄嬛传》小说原文 上网随便百度一个


    当今比较流行的seq2seq基本都是用lstm组成的编码器解码器模型实现,开源的实现大都基于one-hot的embedding(没有词向量表达的信息量大),因此打算自己实现一个基于word2vec词向量的强大的seq2seq模型,首先实现了只有一个lstm单元的机器人

    请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

    下载《甄嬛传》小说原文

    上网随便百度一个“甄嬛传 txt”,下载下来,首先要把文件转码成utf-8编码,然后要把windows的回车符都替换成\n,以便后续处理,最终效果如下:

    [root@centos $] head zhenhuanzhuan.txt
    序文--不过是「情」
    
        在键盘上敲落一个个文字的时候,窗外有大雨过后的清新。站在十二楼的落地玻璃窗前往外看,有大片大片开阔的深绿蔓延。
    
      我喜欢这个有山有水的小城,所以在这样一个烦热的下午,背负着窒闷的心情不顾一切逃出暂居的城市,来到这里,在写完了一个整整写了三年多的故事之后。
    
      终于,写完了《后宫:甄嬛传》的最后一本,第七本。七,是我喜欢的一个数字。甄嬛的故事,最后一个字,是我在初夏的某日坐在师大某个小宾馆的房间里写下的。这个故事,自我在母校时始,又于母校终,像一个有始有终的圆圈,终于完结了。
    
      这是我的第一部长篇,自己也轻吁一口气,居然写了那么长,那么久。
      可是完结的那一刻,我心里一点也不快活。因?是我自己,把我喜爱的清,把我理想中温润如玉的男子,写到玉碎斑驳。
    

     

    对甄嬛传切词

    切词工具word_segment.py请到我的github下载,地址在https://github.com/warmheartli/ChatBotCourse/blob/master/word_segment.py

    执行

    python ./word_segment.py zhenhuanzhuan.txt zhenhuanzhuan.segment

    生成的文件如下:

    [root@centos $] head zhenhuanzhuan.segment
      序文 - - 不过 是 「 情 」
    
     在 键盘 上 敲落 一个个 文字 的 时候 , 窗外 有 大雨 过后 的 清新 。 站 在 十二楼 的 落地 玻璃窗 前往 外看 , 有 大片大片 开阔 的 深绿 蔓延 。
    
         我 喜欢 这个 有山有水 的 小城 , 所以 在 这样 一个 烦热 的 下午 , 背负着 窒闷 的 心情 不顾一切 逃出 暂居 的 城市 , 来到 这里 , 在 写 完 了 一个 整整 写 了 三年 多 的 故事 之后 。
    
         终于 , 写 完 了 《 后宫 : 甄 嬛 传 》 的 最后 一本 , 第七 本 。 七 , 是 我 喜欢 的 一个 数字 。 甄 嬛 的 故事 , 最后 一个 字 , 是 我 在 初夏 的 某日 坐在 师大 某个 小 宾馆 的 房间 里 写下 的 。 这个 故事 , 自我 在 母校 时始 , 又 于 母校 终 , 像 一个 有始有终 的 圆圈 , 终于 完结 了 。
    
         这 是 我 的 第一部 长篇 , 自己 也 轻吁 一口气 , 居然 写 了 那么 长 , 那么 久 。
         可是 完结 的 那一刻 , 我 心里 一点 也 不 快活 。 因 ? 是 我 自己 , 把 我 喜爱 的 清 , 把 我 理想 中 温润 如玉 的 男子 , 写 到 玉碎 斑驳 。

     

    生成词向量

    为了能应用词向量,我们利用word2vec来生成词向量,word2vec的源码可以从网上下载(或者可以在我的github上下载https://github.com/warmheartli/ChatBotCourse/tree/master/word2vec),make编译即可

    执行

    ./word2vec -train ./zhenhuanzhuan.segment -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15

    这样会生成一个vectors.bin文件,这就是我们想要的基于甄嬛传原文生成的词向量文件

    如果想知道vectors.bin文件里如何存储以及如何加载,可以参考我的另一篇文章《三十二-用三千万影视剧字幕语料库生成词向量

     

    训练代码

    下面是我的代码原文,仅供参考

    # -*- coding: utf-8 -*-
    
    import sys
    import math
    import tflearn
    import chardet
    import numpy as np
    import struct
    
    seq = []
    
    max_w = 50
    float_size = 4
    word_vector_dict = {}
    
    def load_vectors(input):
        """从vectors.bin加载词向量,返回一个word_vector_dict的词典,key是词,value是200维的向量
        """
        print "begin load vectors"
    
        input_file = open(input, "rb")
    
        # 获取词表数目及向量维度
        words_and_size = input_file.readline()
        words_and_size = words_and_size.strip()
        words = long(words_and_size.split(' ')[0])
        size = long(words_and_size.split(' ')[1])
        print "words =", words
        print "size =", size
    
        for b in range(0, words):
            a = 0
            word = ''
            # 读取一个词
            while True:
                c = input_file.read(1)
                word = word + c
                if False == c or c == ' ':
                    break
                if a < max_w and c != '\n':
                    a = a + 1
            word = word.strip()
    
            vector = []
            for index in range(0, size):
                m = input_file.read(float_size)
                (weight,) = struct.unpack('f', m)
                vector.append(weight)
    
            # 将词及其对应的向量存到dict中
            word_vector_dict[word.decode('utf-8')] = vector
    
        input_file.close()
        print "load vectors finish"
    
    def init_seq():
        """读取切好词的文本文件,加载全部词序列
        """
        file_object = open('zhenhuanzhuan.segment', 'r')
        vocab_dict = {}
        while True:
            line = file_object.readline()
            if line:
                for word in line.decode('utf-8').split(' '):
                    if word_vector_dict.has_key(word):
                        seq.append(word_vector_dict[word])
            else:
                break
        file_object.close()
    
    def vector_sqrtlen(vector):
        len = 0
        for item in vector:
            len += item * item
        len = math.sqrt(len)
        return len
    
    def vector_cosine(v1, v2):
        if len(v1) != len(v2):
            sys.exit(1)
        sqrtlen1 = vector_sqrtlen(v1)
        sqrtlen2 = vector_sqrtlen(v2)
        value = 0
        for item1, item2 in zip(v1, v2):
            value += item1 * item2
        return value / (sqrtlen1*sqrtlen2)
    
    
    def vector2word(vector):
        max_cos = -10000
        match_word = ''
        for word in word_vector_dict:
            v = word_vector_dict[word]
            cosine = vector_cosine(vector, v)
            if cosine > max_cos:
                max_cos = cosine
                match_word = word
        return (match_word, max_cos)
    
    def main():
        load_vectors("./vectors.bin")
        init_seq()
        xlist = []
        ylist = []
        test_X = None
        #for i in range(len(seq)-100):
        for i in range(10):
            sequence = seq[i:i+20]
            xlist.append(sequence)
            ylist.append(seq[i+20])
            if test_X is None:
                test_X = np.array(sequence)
                (match_word, max_cos) = vector2word(seq[i+20])
                print "right answer=", match_word, max_cos
    
        X = np.array(xlist)
        Y = np.array(ylist)
        net = tflearn.input_data([None, 20, 200])
        net = tflearn.lstm(net, 200)
        net = tflearn.fully_connected(net, 200, activation='linear')
        net = tflearn.regression(net, optimizer='sgd', learning_rate=0.1,
                                         loss='mean_square')
        model = tflearn.DNN(net)
        model.fit(X, Y, n_epoch=500, batch_size=10,snapshot_epoch=False,show_metric=True)
        model.save("model")
        predict = model.predict([test_X])
        #print predict
        #for v in test_X:
        #    print vector2word(v)
        (match_word, max_cos) = vector2word(predict[0])
        print "predict=", match_word, max_cos
    
    main()

     

    解释一下上面的代码,load_vectors是从vectors.bin中加载词向量,init_seq是加载甄嬛传切词后的文本并存到一个序列里,vector2word是求距离某向量最近的词,模型中只有一个lstm单元

    请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

    执行效果如下:

    [root@centos $] python one_lstm_sequence_generate.py
    begin load vectors
    words = 16995
    size = 200
    load vectors finish
    right answer= 站 1.0
    ---------------------------------
    Run id: DQK34Q
    Log directory: /tmp/tflearn_logs/
    ---------------------------------
    Training samples: 10
    Validation samples: 
    --
    Training Step: 500  | total loss: 0.33673
    | SGD | epoch: 500 | loss: 0.33673 - acc: 0.1748 -- iter: 10/10
    --
    predict= 站 0.941794432002

    可以看出:经过500个epoch的训练,均方损失降到0.33673,并能以0.941794432002的余弦相似度预测出下一个字

    如果你有强大的gpu,可以调整上述参数,把整篇文章都训练进去,稍稍修改代码中predict的部分,让他不断的输出下一个字,就可以自动吐出甄嬛体

    这段代码是基于tflearn实现的,在tflearn官方文档的examples中实现的seq2seq是直接调用了tensorflow中的tensorflow/python/ops/seq2seq.py,而这部分是基于one-hot的embedding方法,这是一定没有词向量效果好的,因此下一步打算基于上面的代码继续改造,实现基于词向量的seq2seq,相信能够让我的聊天机器人问答效果更好,敬请期待

    展开全文
  • 当发送端把很多的数据包发送给接收端的时候,数据包并不是按照发送的次序到达,也就是说,我发送的第五个数据包,可能比发送的第个数据包更早的到达接收端, 那么这样一来,如果按照数据的接收顺序写入文件的话...

    工具:

    C++/MFC

     

    原理:

    1.      服务器与客户端之间的通讯,通过socket套接字

    2.      一个电脑有一个ip地址,和6万多的端口号

    3.      当一个socket被创建,就会有一个ip和端口号联系到socket上

    4.      一个应用程序,可以设置多个端口,即:客户端可以设置多个socket

    5.      一个电脑相当于ip,电脑上的应用程序的一个功能相当于一个端口(4,5点的理解很重要)

    6.      需要使用线程,因为sendto和recvfrom函数是阻塞的

    7.      C(客户端)与S(服务器)之间的传递时通过数据包(char*)

    8.      需要发送的信息,可以通过设计char*格式或者结构体来发送过去,即,C整合数据,S解析数据,然后在两端分别处理

     

    思想:

    1.      UDP多人聊天:

    <1>多人聊天意思不是多人在一个地方群聊(当然这个实现很简单),这里我要说的是,客户端之间可以相互聊天,point2point,别人不知道内容。那么,服务器这时候扮演的是一个邮局的身份,而两个客户端就是发信人和收信人,发信人,把需要发送的信放到邮箱里面,然后邮局会过来取,那么邮局就会通过收信人的地址,把信投递到当地的邮箱中,然后收信人过来取,那么服务器就相当于一个转接员。在程序中的体现是服务器端保存所有登陆的用户名和他们对应的IP地址和端口号,当收到一个用户的请求的时候,就开始搜索,指定用户的IP和端口号,然后把相应的信息,发送到目标IP和端口号上,这就完成了C/S之间的通讯。

    <2>这里需要掌握的知识是,套接字库的初始化,创建套接字,学会使用sendto和recvfrom,

    这里要注意的是sendto和recvfrom是阻塞函数,意思就是,如果recvfrom这个函数没有收到数据,他就会卡在那里,直到接收到数据,sendto也是阻塞的具体百度。

    服务器的处理方式就很简单了,设置结构体USERINFO,内有用户名(这里的用户名,一定要是唯一标识,类似于QQ号码),然后还有一个sockaddr_in结构体变量,此结构体用来保存一个IP和一个端口号,定义一个vector的容器,其他容器同样可以,当一个客户端发送连接请求的时候,把USERINFO赋值,然后推送到vector容器内,保存此用户的信息。这就是我的服务器一端的大体思路。

    <3>需要学会线程的使用,原因很简单,因为sendto和recvfrom函数的阻塞的,不可以在主线程里面运行,不然主界面会卡死。(具体内容可以百度Afxbeginthread)

    <4>接下来,说一下客户端的思路,客户端首先要发送连接请求,然后开线程进行发消息工作,这一部分最主要的就是消息的整合,我的消息整合是MSG_TYPE-FROMNAME-TONAME-TEXT,然后将这个消息发送过去,即可,当用户推出时发送下线消息。

     

    2.      UDP文件传输:

    <1>大体就是通过二进制方式读取文件,然后通过sendto和recvfrom进行传输,然后再以二进制方式写入文件。

    <2>首先发送文件名和文件大小,目的是为了让接收端(这里为什么说叫接收端,因为,服务器和客户端都可以作为接收端,可以有文件的上传和下载得知)能够创建文件,并且开辟足够大的内存空间去准备接收发来的数据,因为,一个UDP包的大小最大为64k,那么显然当文件过大的时候64k是远远不够的,那么怎么办呢?我们可以把文件拆成很多个包,然后发送过去,然后再在接收端进行整合,这里需要知道一个知识点当发送端把很多的数据包发送给接收端的时候,数据包并不是按照发送的次序到达,也就是说,我发送的第五十个数据包,可能比发送的第十个数据包更早的到达接收端,那么这样一来,如果按照数据的接收顺序写入文件的话,就会出错,例如,发送了五个单词,h,e,l,l,o,那么如果按照接收顺序写入的话,他会可能会写入e,l,h,l,o。所以需要给每一个数据包编号,然后再在接收端整合。

     

    3.      遇到的问题和解决方法:

    <1>结构体是否可以作为数据包进行传输?

               可以,结构体可以强行转化为char*,但是值得注意的是结构体的大小问题,不是sizeof(结构体变量),具体百度。

     

    <2>为什么会丢包?

            接收端接到数据后需要分析数据包,那么必定要花费一定的时间,如果发送端发的数据包的速度过快比如不去sleep,或者sleep时间过短,那么,发送端发送的包,可能在接收端处理上一个包的时候就丢掉了,其实数据包被传到了端口处,如果没有东西接收他的话,那么他就会被丢掉,所以发送端的文件发送,时间间隔要把握一下。

     

    <3>一个端口可以向两个,多个,不同的目的端口发送数据包,但是一个端口不能同时接收两个端口发来的信息,为什么会这样?

               因为之前也提到过了,recvfrom函数是阻塞的,当这个sock在接收消息时候,如果没有接收到,那么他就会一直停滞在那里,那么又有人会问了,sendto函数不也是阻塞的吗?为啥它可以呢?这里不是说他不会那样,只是因为我们无需开一个线程去不停的给对方发送消息,也就是说,我啥时候给别人发送,我就啥时候sendto一下就好了,但是recvfrom需要不停地接收,在一个线程里面,那么这个全局变量sock就会一直被这个线程使用,所以如果再让他来接收消息,那么就是无法接收的。

     

    <4>如何实现单个客户端同时上传下载文件?

               如果只是一个客户端的话,只需要将服务器,发送文件的代码放到线程里就好了,但是如果服务器还要处理其他其他用户的请求的话,那就可以上传一个端口,下载一个端口。

     

    <5>多个客户端上传下载

             我想的方法很笨,因为,不想在一个端口接收所有人的数据包,那样会很慢,而且很容易丢包,然后我就想这在服务器建立多个端口,然后每一个端口用一个线程去维护,然后当一个客户端不需要文件传输服务的时候,就可以把这个端口让出来,让其他人使用,当需要的时候可以向服务器申请,然后服务器发一个没有任务的端口,然后客户端建立连接,进行通讯。

    <6>推出进程,需要发送,功能结束消息之后break

     

    没有学习很深,只是在做课设过程中遇到的一些问题,和自己的解决方法,我处理的方法很菜也很水,望指教。

     

    展开全文
  • 基于Android的聊天室应用 ChatRoom 1.4

    千次下载 热门讨论 2013-10-26 18:12:11
    七、这个项目完成可不止天哪,所以收10分不过分,如果你觉得很需要一个聊天类的应用参考实践一下,那这就是你所需要的,这只是一个一对多的聊天应用,当然你可以自己扩展成一对一的,其实就是再加一个页面就可以了...
  • iOS即时语音聊天技术实践

    千次阅读 2013-08-27 20:24:10
    CMDN Club第五期活动已于3月15日顺利举行,本次活动以“移动平台语音技术的应用与实践”主题,以语音技术开发为焦点,从语音基础服务、语音产品开发、语音技术实现等多个维度,探索语音产品创新和技术实践的热点...

    CMDN Club第十五期活动已于3月15日顺利举行,本次活动以“移动平台语音技术的应用与实践”主题,以语音技术开发为焦点,从语音基础服务、语音产品开发、语音技术实现等多个维度,探索语音产品创新和技术实践的热点话题。我们邀请了北京爱图腾科技高级iOS开发工程师张天虹,为大家带来iOS即时语音聊天技术实践演讲。

    图:北京爱图腾科技高级iOS开发工程师张天虹在做演讲

    以下是文字实录:

    张天虹:大家好我是来自爱图腾的张天虹,大家可能对爱图腾有些人比较熟悉,有些人比较陌生,爱图腾是主要以移动外包为主的一个公司,我们的特点是比较开放,因为我们在平时开发中包括我们开发人员、设计人员还有一些各种平台开发的时候一些人员他们在技术方面都是共享的一个思想,包括你可以去我们官方博客上可以看到,我们的很多实现一些技术的实现我们已经贴到博客上了大家可以讨论。还有我们公司每周五下午都有一个技术交流会,之前我们也告诉大家可以到我们公司一起去研究这些技术、一起讨论、一起踢馆现在也可以去,每周五下午都可以去看一看。(主持人:我补充一下,爱图腾也是工程式文化的公司,所以我们可以从爱图腾里面淘出又会技术又可以有这样人出来,所以很鼓励自己公司可以在自己公司内部以合作的方式有这样的技术分享,无论是博客或者是线下活动。)

    DEMO介绍:主要就是一个功能,我不知道效果好不好,因为这个跟网络有关。现在可以看看效果,这就是IPHONE4S手机,我做这个DEMO就是这个,我们按住录音发送出去,它可以根据我声音的大小,我放手之后这个语音就发出去了,因为这是受网络的限制,我不知道效果好不好。因为这个跟网络有关,因为我们数据发出去以后。大家可以说一下结果是什么?他说话可以在上面就跟我们平时播放的米聊一样的效果。我们看完了这个DEMO之后,大家已经知道它的基本功能了,我们知道DEMO实现功能第一是录制,录制完了之后通过网络发送到服务器,然后服务器把这个语音传回来之后,到另外一台设备上进行播放,知道这个之后我们看看它是怎么去实现的。

    从技术上讲主要就是录音:把录音文件发到服务器,再从服务器传到另外一个设备进行播放,这个过程是非常简单的,但是考虑一个问题就是要适合网络传输,因为网络是特别脆弱的,不管是发的时候还是收的时候它会占到我们手机的流量,这个流量是大家比较关心的,因为这个网络确实太贵了,为了便于网络传输我们进行一个压缩和解压的过程,知道这个过程之后,我们可以进入我们iOS平台要讲的东西。第一个是语音录制、语音编解码、语音播放,还有Audaio Session还有语音实践。

    这个项目开发中会有加密和解密这些东西,我们现在就不提它了,我们现在看看语音的录制,在语音录制里面我们会讲哪几个,我们比较想了解就是IOS里面录制哪些语音格式,还有我们的API怎么去使用,还有录制的音量怎么样,录制的时候波浪会随着我们声音大小变换,这个是IOS也支持的。

    我们看看iOS支持默认语音录制格式,他支持的格式不是很多,很多我们想要可能没有,但是我们可以给大家介绍基本的格式它是支持的AAC压缩比较高,效果比较好。还有ALAC,还有ILBC,这个用于网络传输的一个语音格式。IMA4这是一个压缩效率很高,但是各方面因为效率高了,可能别的算法、复杂度可能降一点,要求效率比较高考虑这种格式,还有LINEAR PCM,这个是无压缩的,还有U—LAW和ALAW。

    我们知道它默认的语音格式之后,就看看它怎么去录制,我们这里面有一个很简单的类叫AVAudioRecorder,设置录音的目标文件,还有设置录音的文件信息,录音方式很多种,得到格式也有很多种,在初始化的时候可以设置一个录音的基本信息,包括录音格式,这里面在API里面提供了很多格式支持,比如说PCM,以及刚才所提到的支持的格式都可以放到这个里面可以生成。还有录音采样率,还有录音通道有单通道和双通道,还有线性采样位数,这是我们可以根据我们的需要设置。

    我们知道我们想要录音的设置之后,我们实例AVAudioRecorder,创建录音文件,准备录音,开始录音。我们先创建再录音这样效率更高一些。

    这是整个录音的过程,受到指定任何一个本地文件,苹果比较建议是放在TEMP文件里面,然后还有是录音的设置,这里可以设置录音格式,就是PCM的录音格式,采用率,通道数还有位数,我们把这几个参数传进去创建录音文件,录音就这么简单,我们录音一个过程就可以实现了。苹果的API比较规范的,很简单就可以达到我们想要的效果。

    录音:录音的时候捕捉话筒的音量,可能大家没看的很清楚,就是话筒音量大要的播放,我们这个也很简单,MeteringEnabled,也是属于CODER的方法,很简单通过两个方法拿到这段时间一个音量的平均值,以及音量的峰值,这两个值出来以后音量很显然出来了。这是我们录音时捕捉音量的方式。

    还有就是面向音频流的录音方式。因为面向音频流不是你录的时候直接生成一个文件,你想边录制边传输就可以面向音频流录制这个文件,这个不细讲了,因为这里面内容很多,你们可以上苹果里面下一个SPEAKhereDemo。我们可以一起交流它怎么去使用,它的原理是什么,我们如果灵活用它,也可以实现很多很强大的功能。

    录完了声音,刚才我们只是说把录音录完了生成一个文件过程,这时候我们想把通过文件的方式发出去就要进行云的编解码,我们看一张图,这张图展示了从录音到最后保存到硬盘文件的过程,录音它最先录制成PCM的格式,再转成AAC,中间经过CODEC这里面就是一个编码解码器主要作用是对音频信号进行压缩和解压缩。我们讲讲它一个基本过程,首先从话筒里面录制PCM出去,这个CODEC把PCM转换成AAC格式,把AAC写成硬盘文件,就三步就可以达到一个效果,中间一个CODEC起到转码的过程,就了解到它怎么录出数据格式的办法。

    刚刚讲CODEC,重点转移到CODEC里面,这个CODEC我们在录制的声音可能很多我们想要的声音并不是IOS支持的,我们看看IOS支持的这些CODEC,包括我们刚刚提到这些格式这是默认的CODEC,而我们在平时的应用中或者说开发中可能我们想要提供更加广泛的比如说MP3、WMA、MIDI、OGG、Speex可能大家之前不了解,但是我们今天了解一下到底是什么样的语音格式。我们想要录制这些格式,但是IOS没有默认支持的CODEC,怎么办呢?我们可以用开源的CODEC,因为CODEC是一些服务商提供的,他可能是收费的,我们这里可以看看哪些开源的CODEC可以使用,它的工程在网上有很多开源的厂商提供了都是免费的,我们看Speex。

    Speex是一个压缩比较好的、便于网络传输的,而且有一些降噪的功能,这个就是说他比较适合的语音聊天,还有LAME这个格式,还有苹果的Lossless,这是去年年底才开源一个项目,这是苹果无损压缩的CODEC。还有FLAC这个是免费的无损CODEC,还有LBC也是适合于网络传输的CODEC。

    我们下载到CODEC以后这时候有一个比较难的技术门槛,有了CODEC以后我们怎么编程我们IOS连接库呢?因为要用PCM,要拿到链接库,这就需要编译了,我们先了解Xcode,我们Xcode为了让我们支持更好的IOS设备,比如说IPHONE2或者3,更低版设备我们就需要更多的处理器架构。首先我们看Xcode需要哪些处理架构呢?I386、ARMv6、ARMv7。我们知道这个处理架构以后,我们就要编译我们的CODEC,首先编译一个适合I386的CODEC,还有V6、和v7的,我们编译好了以后才能拿来具体使用。编译的方式我再跟大家提一下。

    我们有了编译好的链接库以后就可以使用CODEC编码器和解码器。编码过程是这样的,首先录制完了以后,因为我们想录制成为我们自己的CODEC地所以我们默认为PCM文件,PCM在IOS录制出来是一个WAV的文件格式,因为它不仅是一个数据,还要成为一个文件在我们播放器里播放的。我们看WAV格式,我们可以看到在网上可以搜到资料,这里面的数据结构有很多块信息,但是我们最后可以了解到,我们真正需要的是这个块数据,我们通过数据格式最后拿到这个,我们知道数字结构以后我们可以拿到采样数据,这个我相信大家知道一点,知道怎么去拿,不知道也可以线下交流一下。然后我们拿采样数据已经扣上了,压缩成我们想要的目标格式。最后我们压缩的数据格式还不行,因为我们录制好的格式不光是用设备传输,可能我们还用别的平台,比如说IPHONE给ANDROID传送的文件,因为不知道压缩是什么东西,这时候加一个文件结构,我们重新组装压缩后的文件结构,这样别人才知道我压缩后的文件是什么格式。这是一个编码过程。

    这个编码完成之后,我们就可以把这个数据放在另外一个设备了,编码结束了。别人拿了数据以后肯定考虑播放了,这个数据怎么处理之前我们先讲讲IOS播放怎么实现,IOS支持播放的格式,跟录音的格式是差不多,只是多了一个MP3和ILBC的格式,多了MP3解码的一个支持。我们看看播放怎么用,相对录来说播放简单多了,首先这个传输的值可以从文件里面提取过来的数据就可以了,然后准备播放开始播放,就可以播放出来了,很简单。

    AAC文件播放过程是怎么做的?首先跟录音过程是相反的,首先是解码,解码放到里面播放,读取AAC,播放PCM文件。

    知道播放原理以后,把我们刚才那多的CODEC到另外一个客户端去解码,解码怎么办呢?这就是我们拿到一个数据,刚才编码完成的数据是这样的,发过来数据就应该这样的,我们的解码过程中又需要把这个信息去掉了,因为我们只需要解码中间的数据而不需要解析文件具体的结构,而是关心编码后的数据,这个也很简单,CODECDecode的方法,因为PCM最后格式是WAVE文件才能播放。这是一个解码的过程。

    整个过程大家应该了解了,我们想要用自己的一个CODEC录音播放的过程。下面了解一下AUDIO Session。AUDIO Session是IOS中用于处理应用,比如说如何处理多个应用的音频输出,比如说我听APPLE,这时候开启另外一个应用,另外一个也有声音的播放,这个时候怎么处理呢?还有我们在锁屏情况下我们的应用和播放声音这时候我锁屏了,还有我把音量键关到最小的时候有一些应用就不让关,即使你玩游戏音量键也关不了。还有就是是否在应用里面支持录音,还有是否支持语音的播放。AUDIO Session是管理这些过程的,我给大家一个比较直观的图,我这个应用,这是飞机一个控制台应用,首先第一架飞机正在飞,就是正在播放声音,另外一个应用说我也要播放声音了,这时候控制台把它记录下来说它要播放声音了,这个SPEAKHERE说也要播放声音了,就是告诉控制台,我AUDIO Session要播放声音了,那控制台就告诉SpeakHere关闭声音。

    应用中可以设置的几种音频模式:你声音调到静音以及锁屏的情况下声音是否播放,另外一个情况就是我这个应用在使用的时候,是否支持别的应用,同时在使用这个声音。还也就是我这个应用是否支持声音的录制或者播放,还有不同的组合,我们在应用里面就是说我在锁屏情况下不允许播放声音,或者可以播放声音。它怎么使用呢?看看最下面这一行代码,我们设置它一个模式就可以了,也是一句话事情,用起来非常方便。

    我们讲完了AUDIO Session,下面具体讲讲我们刚才的DEMO是怎么做的?首先跟我们刚才讲的过程是一样的。

    第一步要去下载Speex的CODEC,它的网页里面可以下载下来了,下载下来是一个C的工程,这时候我们编译适合我们Xcode开发的一个Speex CODEC LIB就是开发库。这里举一个例子在我们编译一个基于模拟器的DEMO怎么做,我们可以直接在这里打包Host和build,就可以了。将LIBSpeex.A引入Xcode开发环境中,这个设置要非常细心,指定好头文件,指定好了以后,我们可以引入Speex.H文件。

    我们有了我们文件库以后,获取录制的PCM文件的音频数据把这个代码提取出来,就是采样的文件提取出来,这个过程可能相对繁琐一点,只要找到这个块就可以把采样数据拿到。拿到这个采样数据以后我们才对它进行一个编码。Speex一个编码的函数,这种方法是基于帧的,并不是一个文件一个文件处理,而是定一个帧的长度基于帧的编码为你想要的一个Speex格式,最后Speex添加Speex文件的头信息,然后通过Socket发送Speex文件数据到服务器,服务器传到另外一台设备,设备接受为Speex文件并解码为PCM音频数据。这个Speex还有很多很多的功能,包括录制之前的设置和降噪都可以设置。通过解码将PCM数据恢复为WAVE文件格式,可以播放这个文件。今天讲主要是这么多。

    线下希望共同的交流包括技术上的问题,因为我看现在语音发展特别快,我看讯飞和UC做的非常好了,非常人性化,包括这方面的技术到底怎么去实现和解决的技术交流,我们可以一起交流,不管是微博各种平台都可以交流,谢谢大家。

    展开全文
  • 也许局域网聊天的确比较累,也许局域网聊天待遇也不是那么高,也许局域网聊天很难找到女朋友,不过三百六行,行行有本难念的经。既然干上了,而且自己也很喜欢,就好好干。患得患失的心态, 一定要努力克服。...
  • Web端即时聊天项目实现(基于WebSocket)

    万次阅读 多人点赞 2018-02-28 16:06:53
    Web端即时聊天项目实现 项目背景  其实这个项目算是我做过的花时间最长也投入心血最多的一个项目了,当时决定开始做这个的时候我几乎什么都不会,那时我个人的情况是: - JavaEE方面: 会jsp+servlet,也简单...
  • 在15分钟内建立去中心化网络聊天 在这个15分钟的教程中,我们将构建一个简单的分散式聊天应用程序,该应用程序完全在Web浏览器中运行。 ... 我们将使用Bugout ,这... 如果只需要这些文件,请在此仓库中下载index...
  • 类似QQ聊天界面

    千次阅读 2017-03-02 11:22:04
    现在越来越多的手机软件具备社交聊天功能,所以聊天界面的使用便变得很频繁,下面我们将自己实现一个简单的类似QQ的聊天界面。 首先来看整个工程的目录结构: 目录结构很简单,主要难点在Adapter。 然后看实现...
  • 构建WebIM聊天程序

    万次阅读 2016-06-11 14:30:15
    最近研究了一下WebIM,现将学习笔记记录于此。一、WebIM采用技术本篇实现的WebIM是对现有技术的整合,它包含了如下技术: seajs:用于JavaScript...layim:阿里大牛贤心制作的一款webim聊天界面,很美观,源码下载
  • 使用iTunes与iTools导出微信聊天记录

    千次阅读 2019-04-17 18:17:25
    这么一来,微信的聊天记录就无法直接导出来存储备份了。BUT,天无绝人之路,还是有办法可以导出来嘀. 需要用到的工具 1,itunes(网上自己去下载) 2,iTools经典版(百度里面找的到) 新版的iTools里没有“iTunes...
  • 即时聊天软件与开放平台

    千次阅读 2011-06-17 00:04:00
    这个想法由来已久,自从被学习了写程序,就屡屡下载安装使用删除各类软件无数次,折腾了四年,发现当年那些不争气的软件现在还是那么不争气,仍然奄奄一息地苟延残喘着。废话不多说,此次测评平台为Windows7旗舰版,...
  • 使用 Groovy 合并 MSN 聊天记录

    千次阅读 2011-05-05 15:57:00
    介绍如何用 Groovy 脚本考察简单的 xml 文件结构;合并 MSN 聊天记录;设置全自动的记录同步
  • chatbot聊天机器人技术路线

    千次阅读 2018-06-12 14:12:27
    (其中第一种是属于“调用第三方API”,也就是说核心代码和数据库不掌握在自己手里)(第二、三、四种属于开源框架,也就是说我们可以下载其源码,采用,相对快速的自己搭建一个聊天机器人,核心代码和数据库都掌握...
  • 移动互联网

    千次阅读 2018-10-17 10:16:40
    雷军正是瞄准了这个区间,他认为中国有几亿的手机用户,哪怕只有10%,也是一个千亿级的市场。 7 2009年11月的一个晚上。 雷军和晨兴资本的刘芹打了12个小时的电话,这中间,雷军换了3块电池,刘芹换了3部...
  • 论坛聊天日常用语

    万次阅读 2009-03-21 08:28:00
    1、BT:①Bit Torrent的缩写,是一种P2P()共享软件,中文译名“比特流”或“变态下载”。②“变态”的缩写。 2、ZT:①“转帖”的缩写。②“猪头”的缩写,引申有ZT3,猪头三;ZT4,猪头四。 例句:青眉...
  • AJAX聊天室实现原理 JQuery+PHP

    万次阅读 热门讨论 2009-05-30 13:31:00
    AJAX 聊天室实现原理终极解析闲来无事,做了一个AJAX聊天室,以前一直想做一个,因为我和几个朋友是Linux机子,尽管我们的机子上都有apache服务器,但要发送一个信息却不是很容易,老是要借助客户端,有时候吧Linux...
  • FICS是免费的国际象棋服务器(其实就是个命令行下棋的网站,有许多界面比如...(虽然延迟有点大,而且每次聊天的字数有限制,每一句只能有几个汉字) 这里真正的困难在于,FICS客户端不支持中文字符的聊天...
  • Python多线程爬取表情包,1秒下载张表情包

    千次阅读 多人点赞 2019-11-10 13:55:21
    前言 文的文字及图片来源于...从 QQ 到微信,表情包一直都是中国互联网用户的「心头好」,时至今日,甚至发展到了「无表情包不聊天」的地步。 无论是正事儿还是闲侃,表情包都必不可少。聊天到一半发现表情包不够用...
  • Java网络编程聊天小案例

    千次阅读 多人点赞 2021-05-11 15:28:16
    Java网络编程聊天小案例 网络编程 每一台计算机通过网络连接起来,达到了数据互动的效果,而网络编程所解决的问题就是如何让程序与程序之间实现数据的通讯与互动 在吗?你是GG还是MM? (一) 网络模型概述 (1) 两...
  • 智能客服、聊天机器人的应用和架构、算法分享和介绍 Github https://github.com/chatopera/chatbot.catalog.customer-service 目录聊天机器人汇总对话管理知识图谱智能客服知识库阿里巴巴小蜜非技术推广其他天猫蚂蚁...
  • 想想这一年来我俩的聊天记录也不少(导出后一看个月的微信文字聊天记录将近8万条 ^-^),于是就有了将我们的聊天记录导出来制作成词云,或者分析一下她说的最多的一句话是什么?还打算做个预测模型,输入一个句子...
  • 基于epoll实现的c++聊天室(全代码)

    千次阅读 2018-11-02 15:03:13
    早些时候为了更加熟悉网络编程,所以写了一个聊天程序练练手,但那是纯linux终端实现的,没有界面,最近心血来潮翻出来加了个Qt的简单界面,成了一个简易的局域网聊天室,通过tcp服务器来转发消息,其实最初实现的...
  • 如上图所示,该游戏的聊天服务需要支撑750万并发用户,2700万日活跃用户,每秒钟需要处理的消息上万条,每台服务器每天处理消息达亿条。 对于对战类型游戏,团队间交流直接影响到了比赛的胜负。为了帮助完成这...
  • 前言 ...从 QQ 到微信,表情包一直都是中国互联网用户的「心头好」,时至今日,甚至发展到了「无表情包不聊天」的地步。 无论是正事儿还是闲侃,表情包都必不可少。聊天到一半发现表情包不够用怎么...
  • 微信聊天记录做成词云~

    千次阅读 2020-06-01 19:43:08
    最近快毕业了,所以想把微信聊天记录全部导出、做成词云、然后寄给好友,想想都很浪漫,哈哈。先上词云结果图(结果图拿《三国演义》的,想啥呢,我才不会把我的聊天记录发到网上,哈哈),然后教大家如何做。 ...
  • 这个小demo是为了练手,把2018年我和我五个好朋友的群聊天记录进行分析挖掘,以及可视化。 python3.6 pandas numpy pyecharts 预处理: 首先从QQ消息管理器里导出聊天记录: 2019-01-12 20:04:30 秋非凡(100****042)...
  • 青少年/ 儿童视频聊天的注意事项

    千次阅读 2012-06-08 16:27:57
    现在,全球有 37% 的青少年使用视频聊天服务,例如Skype 或 iChat,此外还有近三分之一的青少年会拍摄并在线分享视频,在 2006 年这一比例只有14%。虽然数字有继续上升的趋势,但这并不令人讶异。 因为实在...
  • 以后大家想要这些资料,就不用再留邮箱了,直接链接去下载就好了。   下面是这些资料的一个清单(零编程基础开始):   1.《C++ primer中文版》 2.《Windows程序设计第五版》 3.《VC++深入详解》 4.《Windows...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,964
精华内容 7,185
关键字:

下载十点聊天