月度归档: 2023年3月

今天尝试了一个工作流:视频语音转成中英文双语文件

花了两天的业余时间,看完了Lex Fridman 对 Sam Altman的访谈,2个多小时的视频,信息量非常大,看完之后意犹未尽,觉得很多东西需要多看两遍消化一下。而视频又非常不利于反复会看片段内容。于是就把讲话内容转成了双语epub。具体流程是这样的:

1、在油管下载视频的音频部分,用插件也可以,用https://onlinevideoconverter.com/ 来下也可以。如果和我一样用插件下载的音频是webm格式,就还要再多一步把webm装成mp3.

2、把mp3上传到飞书妙记,会自动把语音转成文件,非常快2个小时的音频,大概5-6分钟就转好了,而且是分说话者的——对,聪明的你应该想到了,这玩意儿是做会议记录的神器。

文字内容非常长,这里就截了个开头。我已经把两个说话者名字输进去了,自动把后面全都匹配了。

3、最后一步,从飞书上把文字下载下来,随便pdf,docx还是txt都可以。用ebook-GPT-translator https://github.com/jesselau76/ebook-GPT-translator把文件翻译成中英文双语,并输出为一个epub。用的gpt3.5模型,效果还不错。感觉比飞书自带的翻译好很多。

整个流程还是比较流畅的。没研究飞书的api,如果能够用一个脚本把整个对接起来会非常爽——之前写的同步翻译的脚本可以用whisper来转录语音,但是whisper转录效果不是很好,速度和准确度都不如飞书妙记。翻译后的文字下载链接,其实这个视频B站有中文字幕版,不过是内嵌字幕不能单独下载。

最后,强烈推荐这个视频,值得反复观看。Sam Altman在视频中表现出的智慧,冷静,克制和理性,在open AI其他人的访谈里面也不断看到过,对这个企业的哲学更加感兴趣了。

UPDATE

用ffmpg来获取视频里的音频文件,不需要安装任何视频编辑软件。然后就可以非常快的拿到视频的文本内容。在此基础上无论是翻译还是根据文本来修改写文章都很方便。以后自己上课和培训的内容可以非常快的变成文字。

如何成为一个合格chatGPT意志降临的容器

昨天尝试着做了一个稍微负责点的程序,想用chatGPT来写一个录音转写并同步翻译的小程序。虽然这个功能已经有很多现成的解决方案了,而且效果也都不错,比如讯飞听见的同传。不过我总觉得用chatGPT的API来进行英翻中,应该会有更好的效果,更重要的,会更便宜。

作为一个合格的AI 助手,我的工作就是提供人工,AI 来负责智能部分,我们一起来实现新时代的人工智能。

首先,是向chatGPT(运行的是GPT-4模型)提出我的需求。前期需求尽量不要太复杂,或者不要直接一步到位实现所有功能:为了便于调试,我让它先做一个录音存成文件,然后录音结束后再上传转写,再翻译的过程。先回避了同步上传翻译,在屏幕上同步显示字幕等比较复杂但是非核心功能的部分。

chatGPT很好的理解了我的需求,并给出了四个文件,以record_audio.py为例



import pyaudio
import wave

def record_audio(filename, seconds=5, chunk=1024, format=pyaudio.paInt16, channels=1, rate=44100):
    p = pyaudio.PyAudio()

    stream = p.open(format=format,
                    channels=channels,
                    rate=rate,
                    input=True,
                    frames_per_buffer=chunk)

    print("开始录音...")

    frames = []

    for _ in range(0, int(rate / chunk * seconds)):
        data = stream.read(chunk)
        frames.append(data)

    print("录音结束...")

    stream.stop_stream()
    stream.close()
    p.terminate()

    wf = wave.open(filename, 'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(p.get_sample_size(format))
    wf.setframerate(rate)
    wf.writeframes(b''.join(frames))
    wf.close()

代码的完成度非常高,留给我的其实也就装下库,然后测试一下。这里就是一个合格的AI 驾驶员的必备素养之一:首先你要知道怎么安装python的这些库,怎么样配置一个合格的测试环境,出错的内容如果你能看得懂可以尝试自己先改掉简单,不要直接复制丢回给AI,否则就会遇到我这种情况:

孱弱的人类躯壳无法长时间容纳chatGPT的降临,3小时25次问答,很快就迎来了长时间的技能CD。

这个demo其实需要调的错误不多,基本功能很快就完成了,我又让AI 加了一个程序运行后倒数三秒开始录音,录音满1分钟自动停止。后面可以糊一个简陋的界面来手动控制开始和结束。

想做实时翻译,结果试了几次都失败了。主要问题在于实时翻译设计到多个线程,一边录音一遍缓存,同时上传缓存的文件并转录翻译。我对这块一窍不通,没有办法为AI 提供任何帮助,而一旦脱离了人prompt的引导(咒语吟唱),AI很快就会陷入混乱,它能够有效管理的对话上下文其实非常短,写着写着就忘了前面写过什么了,经常会引用一个它没写过的函数和功能。人类驾驶员的作用就是引导它不要暴走。

项目本身没啥可说的,体验还是挺有意思的:

1、写一个小工具的门槛被降低了非常多,在以前这种程序,像我这种没有开发经验的人,至少要一个星期才能写完,还要查大量的资料。现在也就半天不到的时间。

2、不要指望一个外行加AI就能取代资深的专业人士,AI的上限是使用者的上限,主要是我拖后腿了。从技术选型到代码调试,错基本都是我犯的。

3、这种方法仅限于完成一些小工具小想法,AI对信息的管理能力很有限,写不出大型项目。但是实现项目里面的具体功能和函数还是可以有效提高效率的。

项目我扔到github上了https://github.com/justonehe/real_time_translate,不得不说,AI 写起readme来才是一把好手。它甚至从我前面失败的尝试里面推测出了我后期的改进想法。

所以,好好锻炼身体,争取成为一个合格的AI驾驶员吧。

chatGPT plus 订阅成功,努力克服了一个不应该存在的困难

昨晚花了3个小时来解决这个问题,之前和别人合用的plus帐号遇到续费问题,加上共享帐号是不是出现有人乱删对话的问题。昨天痛下决心去折腾付费订阅,之前不弄还是嫌麻烦,实践证明确实挺麻烦:

1、需要一个虚拟信用卡,大陆卡不能付款,国外实体卡是不是只有美国卡能付我也不知道。反正对我来说唯一的选择就是虚拟卡。我选择的是depay,相对来说注册算方便的。教程网上很多,没啥特别要讲的。

2、depay不支持人民币直接充值,只接受usdt,所以如果你没有数字币钱包交易所帐号,还要去注册一个交易所帐号。这里我因为欧易里面有一笔钱(亏的妈妈都不认识了),所以不用折腾。直接从欧易转出来就行了。

3、折腾梯子去订阅。

里面遇到的几个坑:

1、我从欧易选择用Polygon网络转账USDT,实践证明是个错的选择,应该用别的网络──重点,这里depay只支持plolygon,BEP20和TRC20三个网络,选错了网络钱就没了……昨天欧易转出到depay到帐花了2个小时。

如果遇到这种没有及时到帐的情况,只要你确认两边的收款地址和网络没错,就等着就好了,如果找客服,不要找depay的telegram群组,只要你在群里说一句故障,一分钟之内就会有假冒客服的找你私聊,非常夸张。截图发邮件是一个比较稳妥的方法,虽然慢点。

2、depay生成的master卡号都是能用的,订阅plus的时候如果出现卡不被接受,是网络问题,不需要折腾depay了。订阅plus的时候,开全局代理,浏览器隐私模式,换欧洲,日本节点可能会好点,美国常用的机场ip地址都进黑名单了,这个没啥好办法,多试几个ip地址就行了。

真真切切体会了一把数字难民的感受,还不知道下个月续费能不能成功。

最后,带个货,中亚海外购的英睿达P3 4T才1391,加税到手1521,可以入手了。一个模型数据动不动几十个G,买不起显卡,总买的起硬盘。

关于GPT-4的一些使用想法

昨天晚上用了5分钟时间让GPT 给我写了个修改文件名,自动把 文件里的括号和括号中文字都去掉的代码,用来处理网上下载的名字巨长的电子书。

它给我的第一版其实就完全可用了:

import os
import re

def remove_brackets_and_content(filename):
    return re.sub(r'\([^()]*\)', '', filename)

def rename_files_in_directory(directory_path):
    for root, dirs, files in os.walk(directory_path):
        for filename in files:
            new_filename = remove_brackets_and_content(filename)

            if new_filename != filename:
                old_filepath = os.path.join(root, filename)
                new_filepath = os.path.join(root, new_filename)
                os.rename(old_filepath, new_filepath)
                print(f"Renamed '{old_filepath}' to '{new_filepath}'")

if __name__ == "__main__":
    directory_path = "path/to/your/directory"  # 替换为您要操作的文件夹路径
    rename_files_in_directory(directory_path)

但是只能处理英文的括号。然后我又让它把文件名里by后面的内容(主要是作者信息)都去掉,这次就炸了。

import os
import re

def remove_brackets_and_content(filename):
    return re.sub(r'\([^()]*\)', '', filename)

def remove_by_and_following_content(filename):
    return re.sub(r'by.*', '', filename, flags=re.IGNORECASE)

def rename_files_in_directory(directory_path):
    for root, dirs, files in os.walk(directory_path):
        for filename in files:
            new_filename = remove_brackets_and_content(filename)
            new_filename = remove_by_and_following_content(new_filename)

            if new_filename != filename:
                old_filepath = os.path.join(root, filename)
                new_filepath = os.path.join(root, new_filename)
                os.rename(old_filepath, new_filepath)
                print(f"Renamed '{old_filepath}' to '{new_filepath}'")

if __name__ == "__main__":
    directory_path = "path/to/your/directory"  # 替换为您要操作的文件夹路径
    rename_files_in_directory(directory_path)

这个一运行,文件扩展名也没了。有让它写个代码,把没扩展名的加上.pdf,还好这个文件夹里只有pdf文件。

最后让它加了个功能,在判断括号的时候连中文括号和方括号一起加进判断里。并且确保不会删除扩展名。最后得到了下面这段代码

import os
import re

def remove_brackets_and_content(filename):
    return re.sub(r'\([^()]*\)|\{[^{}]*\}|\[[^\[\]]*\]|([^()]*)', '', filename)

def remove_by_and_following_content(filename):
    file_root, file_ext = os.path.splitext(filename)
    file_root = re.sub(r'by.*', '', file_root, flags=re.IGNORECASE)
    return file_root + file_ext

def add_pdf_extension_if_missing(filename):
    if not os.path.splitext(filename)[1]:
        return filename + '.pdf'
    return filename

def rename_files_in_directory(directory_path):
    for root, dirs, files in os.walk(directory_path):
        for filename in files:
            new_filename = remove_brackets_and_content(filename)
            new_filename = remove_by_and_following_content(new_filename)
            new_filename = add_pdf_extension_if_missing(new_filename)

            if new_filename != filename:
                old_filepath = os.path.join(root, filename)
                new_filepath = os.path.join(root, new_filename)
                os.rename(old_filepath, new_filepath)
                print(f"Renamed '{old_filepath}' to '{new_filepath}'")


if __name__ == "__main__":
    directory_path = "path/to/your/d

结合之前使用的一些经验,目前有这样一些想法:

1、GPT是非常强大的辅助工具,能够解决很多具体的问题,节约大量时间。但是距离让一个完全没有编程知识的人直接用自然语言写出代码,还有很长的距离。在其他学科领域也是差不多的道理,使用者本身的学科知识能力,决定了你能用它发挥多大的作用。

2、人工智能一定会犯错,这个是使用人工智能时候的第一准则。

3、目前来看,想用GPT-4或者类似的大语言工具帮你写程序,至少得像我这种能看得懂一些代码,但是没有实际开发经验。它能够直接生成一个可用的框架,我可以不断要求它去挑整和扩充,比上网找到别人的代码再修改,效率高了很多。

4、从编程的角度来说,学编程不是没有用了,而是更加重要了。完全不会编程的人,目前是没有办法和它沟通让它去写出可行的程序的。只是今后编程学习的方式和目的可能都会有革命性的变化,从学会自己写代码写算法,转变成能够看懂代码,理解代码的逻辑,但是不一定需要自己能够完全写的出来。也就是人从实际的工作者,变成沟通需求和实现的桥梁,具体的实现工作可以交给人工智能。

5、无论是担心人工智能写出负责的系统程序的过于多虑了,目前它也就能写点简单的小工具。不过我认为这是一个非常重要的事情:计算机真正工具化的开始。使用计算机制造自己的工具来解决自己的小问题,而不是只能依赖于别人制作的工具。而且所需的编程能力和知识也大大减少了,我体验下来这是一个学过编程的高中生能够完成的。

6、你具备的开发和编程经验越多,在使用过程中会走的弯路越少。比如前面那个把文件扩展名删掉的问题,明显是我在给需求的时候没有描述清楚,也没有考虑到这种情况。其他学科同理,所以觉得有了人工智能就不用学相关内容的,要么是没用过要么是被误导了,人工智能只会让学习和学习能力更加的重要。

用GPT-4写了个计算俯卧撑次数的程序

前后大概20分钟吧,demo就写完了,里面至少有15分钟是我在安装Mac上的mediapipe环境。

首先把需求告诉它,让它分析下可以怎么做:

根据它的分析,我决定先实现计数的基本功能:

代码有点长,我让它把不同的功能独立实现,它也实现了:

然后进行了一下调试,当然代码里面有点错误,不过它很快就自己改过来了:

然后demo就跑起来了,保存数据也实现了。后面就是改进一下计数的算法,减少误差,然后看看能不能增加一个制定训练计划的功能。感觉第二个不一定能做出来。

作为一个没有实际编程开发经验的人,这个流程的顺利程度还是超乎了想象。整个过程中,可能提出正确的需求是最重要的,而搞定本地运行环境进行测试是对普通人来说难度最大的。

感觉今后编程教育整个会被颠覆,传统的敲代码可能成为过去式了,编程会从一个技术性工作变成一个创意性工作。

PS:在整个编程过程中,我一个字的代码都没打,错误也是我复制出错的代码行和出错信息,它自己改的。可以说我负责人工它负责智能,合作贡献了一个面向复制粘贴的编程结果。当然这个程序很简单,复制的功能和程序可能它未必能写出来或者未必能改对所有的bug,但是这个场景依然能够提供足够广阔的想象力。

测试了一下谷歌的Bard

昨晚睡觉前突然看到谷歌开放了Bard的试用申请,就果断填了。入口在这里https://bard.google.com/,需要谷歌帐号,美国ip地址。相比其他的,要求算是很低了。

早上起来发现申请已经通过,可以用了。newBing当时申请等了一个星期才通过,这点可以好评加分。

早上草草测试了一下,可以联网,不支持中文,内容生成比newBing快。英文链接给它,可以帮忙生成摘要和总结,可以就单个链接进行追问和讨论。

这是我给了一个链接让它去总结

可以要求它后面的对话围绕这个链接内容进行,效果和之前在newbing上测试的差不多

如果谷歌的Bard去年年底出来,那我会惊为天人,但是现在,有GPT4在前面,我只能说,就这?

别说打不过GPT4,连newBing也打不过,甚至不如我用传统谷歌搜索加上Glarity Summary插件

另外目前Bard不会写代码,直接负分。

用GPT-4做题第二篇

昨天做一道题目,手写梯度下降的反向传播函数。之前看的书上都只讲了原理,代码用keras库,两行就没了。这次题目要求全部自己实现。

其实题目不算难,激活函数和损失函数都已经给出了。我打了个草稿,画了个图之后差不多理解了。但是对numpy不熟,很多线性代数计算不知道怎么写。然后就让chatGPT 帮我写。

我给了它要求,但是它默认用了sigmoid函数作为激活函数,而我希望使用ReLU,然后又更新了条件,让它重新写。

那么问题来了?

我算是学会了梯度下降的反向传播算法吗?代码我完全看懂了,数学上我完全写的出,但是再让我自己写代码,我大概率还是写不出来。numpy还是记不住。

GPT4算是会梯度下降的方向传播算法吗?毕竟代码都是它写的。

然后更大的问题是,今后这个我还有必要学下去吗?哪些内容是有必要学的,哪些内容是可以让GPT 帮我做的?学到什么程度我能说一句我学会了?

GPT4的正确做题方式

今天发现一个非常有意思的事情,可以延伸思考一下,如何正确使用GPT4来做题。

我先给了它一道计算一维卷积的题,正确的做出来了。

然后我又给了它一道二维卷积的题,这次它解题的思路依然是对的,但是只做了一半就结束了。

我就让它写一个计算二位卷积的python函数给我。它不但写出了函数,还把题目里面的矩阵直接赋值进去了。

然后我让它输出这段代码的运行结果,然后又出错了,和直接计算的错误还不一样。

但是,把这段代码拷贝到python里面运行,输出的结果是正确的。代码本身是正确的。

所以,GPT4毋庸置疑是个非常强大的工具,但是怎么才能正确使用它帮助我们提高学习效率,是一个值得深入研究的问题。

一些延伸思考:

1、什么是学习?

我用GPT4帮我做题算不算学习?我发现了GPT4的错误并改正了它,能不能算我学会了卷积?

2、什么是思考?

GPT4能够正确理解并解释卷积运算,甚至能写出正确的函数,算不算它理解了卷积运算?但是它总在简单的计算上翻车,能不能说它不擅长数学?

它的思考和我的思考本质上是否有不同?

3、什么是记忆

GPT4是基于学习之后的再创作,不是机械的查询,这点是否和人类的学习过程学习模式相似?

2023.3.8 博客又迁回自己的空间

换了个域名,hemin.live 我很喜欢,就是续费的时候有点贵,$29.99。空间放在aws lightsail上面,非常省心。

主要是为了折腾chatGPT的telegram bot,上周末在家里折腾了2天,试了好几个不同的方案,试过本机,试过腾讯云,试过自己NAS 上的dock,由于墙的原因都不行。实在是折腾翻墙折腾烦了,就直接申请了墙外的aws lightsail,果然,三分钟就搞定,没有任何需要改的bug。节约生命=省钱。

既然有了主机空间,有了域名,就索性把博客也迁移过来,希望最近能有空多写吧。推特发的多了,长文写的少了,输出能力的确是差了很多很多。