officePython

如何边睡边学?——Python实现PDF论文转音频文件MP3

2021-04-15  本文已影响0人  走错说爱你

最近看到一个文章,表明边睡边学真的可行,只要睡觉的时候听一些学过的东西,就能躺着刷技能熟练度,于是我寻思着把论文转成音频,晚上睡觉的时候听,既能催眠又能啥都不干躺着刷熟练度。这里记录下如何实现。

本文主要使用Python3来实现,简单易上手,代码全部开源,让大家也可以跟我一起007(bushi)

如果不想了解技术细节,只想直接拿来用,可以直接跳过代码编写部分,直达最后代码使用部分。如果你觉得好用,希望能够给我一个赞(能打赏更好),也欢迎去github发表意见建议。

开发环境

准备

在网上搜了下,没有现成的pdf转mp3的方法,于是大致思路为:

  1. pdf文字提取
  2. 文字转音频

以此实现pdf转MP3

这里使用pdfminer实现文字提取,首先安装依赖:

pip install pdfminer4k

此外,还需要安装谷歌gTTS模块:

pip install gTTS

代码编写

pdf文字提取

编写代码(注意要对提取的文字做处理,不然结果会比较杂乱):

def pdfread(pdfPath):
    with open(pdfPath, 'rb') as fp:
        try:

            print(pdfPath)
            #用文件对象创建一个PDF文档分析器
            parser = PDFParser(fp)
            #创建一个PDF文档
            doc = PDFDocument()
            #分析器和文档相互连接
            parser.set_document(doc)
            doc.set_parser(parser)
            #提供初始化密码,没有默认为空
            doc.initialize()
            #检查文档是否可以转成TXT,如果不可以就忽略
            if not doc.is_extractable:
                raise PDFTextExtractionNotAllowed
            else:
                #创建PDF资源管理器,来管理共享资源
                rsrcmagr = PDFResourceManager()
                #创建一个PDF设备对象
                laparams = LAParams()
                #将资源管理器和设备对象聚合
                device = PDFPageAggregator(rsrcmagr, laparams=laparams)
                #创建一个PDF解释器对象
                interpreter = PDFPageInterpreter(rsrcmagr, device)
                allContent = ''
                last_para = ''
                result = ''
                for page in doc.get_pages():
                    interpreter.process_page(page)
                    #接收该页面的LTPage对象
                    layout = device.get_result()
                    #这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象
                    #一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像
                    #想要获取文本就得获取对象的text属性
                    
                    for x in layout:
                        try:
                            if(isinstance(x, LTTextBoxHorizontal)):
                                result = x.get_text()
                                # 去掉pdf文件读取的各种换行符
                                result = result.replace('\n', '')
                                # 去掉参考文献引用
                                result = re.sub('\[(\d+\,* ?-?)+\]', '', result)
                                # 无序列表换行
                                result = result.replace('∙', '\n∙')
                                # 去掉参考文献
                                if re.findall('^references?', last_para.lower().replace(' ', '')) != [] or re.findall('^references?', result.lower().replace(' ', '')) != []:
                                    return allContent
                                # 去掉页脚页码页眉以及内容过少的表格
                                if len(result) > 5 and re.findall('(^[0-9])|(^(research )?article)|(unclassified)|(www.)|(accepted (from|manuscript))|(proceedings of)|(vol.)|(volume \d)|(https?://)|(^ieee)|(sciencedirect)|(\d{4}\)$)|(\d{1,4} – \d{1,4}$)|(cid:)|(^authorized licensed use limited to:)|©|(publication date)|((et al.)$)',re.split('\s+$',result.lower())[0])==[]:
                                    allContent = allContent + '\n' + result
                                # print(result)
                        except Exception as e:
                            print(e)
                        last_para = result
                return allContent
        except Exception as e:
            print('文档读取失败:' + str(e))

文字转音频

编写代码,这里的参数lang表示文字语言,text即为要转化的文字:

tts = gTTS(text=result, lang='en')
tts.save("test.mp3")

主函数

主函数最终为:

if __name__ == '__main__':

    pdfPath = 'a37-islam.pdf' # 需要转换的同一目录下的文件名
    result = pdfread(pdfPath)
    print(result)

    tts = gTTS(text=result, lang='en')
    tts.save("test.mp3")

使用

首先先下载代码

然后修改代码中的主函数内的 pdfPath参数为自己想要转换的pdf文档的路径,然后直接在控制台内使用命令运行程序:

python pdf2audio.py

然后静静等候,等程序运行完毕,就能看到和代码同级目录下出现了一个test.mp3,即为生成的音频:

代码运行 生成的音频

注意:

  1. 程序运行过程中不能断网
  2. 程序运行时间较长(出bug会直接报错,程序没有写死循环,请放心食用),请耐心等候
  3. 论文越长,程序运行时间越久,生成的音频也越大
上一篇下一篇

猜你喜欢

热点阅读