F#奇妙游(29):PPTX注释变音频插入页面

这篇具有很好参考价值的文章主要介绍了F#奇妙游(29):PPTX注释变音频插入页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

突然想做点有用的东西

天天学F#,感觉又没有动力了。还是要做点好玩点的、有用的东西才会更加有积极性。因为F#活在.NET平台中,做有用的东西简直太简单了。结合到最近知乎和别的平台一直在叽叽咕咕发视频,我没有怎么做过视频,但是PPT做得不少。我就想为啥不能把PPT直接搞成视频呢?

这不思路一下子打开了,我平常上的那门课,也可以改成视频教学啊,把PPT一转换,上课就开始播放,我就可以坐在旁边喝茶了,多美啊,小朋友们不懂了慢慢来问就好!就是这样!

强力论点转视频
老师无需费舌唇
课堂上就能播放
学生不懂慢慢问

嗯嗯,那就这样吧!

PPT转视频总共分几步

视频和PPT一比较,就多个音频讲解,PPT本身就是视觉材料,所以视频就是把PPT和音频结合起来。

  1. 确定每页PPT的讲解词,一般我们就写在注释里,以前我们写得很不走心,现在写详细一点;
  2. 把每页的讲解词变成音频,可以自己去录,大佬的自播放那必须用大佬的声音,萌妹子也是,但我是糙汉子,不用自己录,用TTS;
  3. 把每页的音频插入到PPT中,这样就有了PPT+音频的PPT;
  4. 设置音频为自动播放,播放时隐藏;
  5. PPT导出为MP4文件,打完收工。

这样一看起来,相当简单。

F#的实现

输出讲解词的音频

#r "nuget: System.Speech, 7.0.0"

open System.Speech.Synthesis

let produceAudio (s:string) (fn:string) = 
    use synthesizer: SpeechSynthesizer = new SpeechSynthesizer()
    synthesizer.SetOutputToWaveFile fn
    synthesizer.Speak s

这里只需要用到System.Speech这个库,然后就是SpeechSynthesizer这个类,这个类有一个Speak方法,可以把字符串转换成音频,然后用SetOutputToWaveFile方法把音频输出到文件中。

这里唯一需要注意的就是use关键词,这个关键词可以让我们在使用完对象后(到表达式体的范围之外)自动释放对象,这样就不用我们自己去释放了。这里的对象必须是实现了IDisposable接口的对象,这个接口只有一个方法Dispose,释放资源,例如文件句柄、数据库连接等等。下面还会反复用到这个功能。

有一个问题就是一般的wav文件适配性不够好,我们把wav文件转换成mp3文件。

#r "nuget: NAudio, 2.2.1"

open NAudio.MediaFoundation
open NAudio.Wave
let wav2mp3 (source:string) =
    if source.EndsWith ".wav" then
        do MediaFoundationApi.Startup()
        use reader = new WaveFileReader(source)
        let outputFile = source.Replace(".wav", ".mp3")
        MediaFoundationEncoder.EncodeToMp3(reader, outputFile)
        do MediaFoundationApi.Shutdown()
        outputFile
    else
        source

这用了另外一个包NAudio,这个包功能很多,我们这里用得很少。只需要把wav文件转换成mp3文件就可以了。我们用if构造一个验证文件是否是wav文件,如果是,就用MediaFoundationEncoder这个类把wav文件转换成mp3文件,然后返回mp3文件的路径。

把音频插入到PPT中

操作PPT的库有很多,最权威的当然是Open-XML-SDK。但是这个太难了……帮助就来个1000页,不停引用标准ISO/IEC 29500-1:2008,那个标准也不长,只有5560页。包装好的访问PPT的工具部大部分都是收费软件,我不想列名字。

开源的软件中,我们在Open-XML-SDK的主页上找到了推荐的ShapeCrawler。这里也给找软件包的人提示一个方法,到GitHub上找到一个你需要的软件包,然后看看它的主页,一般都会有推荐的软件包。

#r "nuget: ShapeCrawler, 0.48.0"


open System.IO
let insertAudio (slide:ShapeCrawler.ISlide) (fn:string) =
    use stream =  File.Open(fn, FileMode.Open)
    let audio = slide.Shapes.AddAudio(10, 10, stream)
    slide


let producePPTWithAudioFromNote (inputFile:string) (outputFile:string) = 
    use p = ShapeCrawler.SCPresentation.Open(inputFile)

    p.Slides
    |> Seq.iter (fun o -> 
        let notes = o.SDKSlidePart.NotesSlidePart.NotesSlide.InnerText
        let [n; num] = 
            match removeLastNumber notes with
            | Some [note;number] -> [note; number]
            | _ -> [""; "0"]
        let fn = sprintf $"note-{num}.wav" 
        do produceAudio n fn
        let mp3fn = wav2mp3 fn
        if mp3fn = fn then
            failwith $"Error produce mp3 file from {fn}"
        else
            insertAudio o mp3fn |> ignore
        )

    p.SaveAs(outputFile)

上面的函数producePPTWithAudioFromNote就是我们最终想使用的功能,打开一个PPT文件,然后把每页的讲解词转换成音频,然后插入到PPT中,最后保存为新的PPT文件。这里面,打开了文件后,属性Slides就对应了所有的幻灯片页,而每页的SDKSlidePart.NotesSlidePart.NotesSlide.InnerText就是对应的注释内容。我们打开后发现挺好玩的一件事情,每个注释最后都被加了一个数字,这个数字就是这个注释在这个幻灯片页中的序号。

我们只好又编了一个函数把这个数字提取出来。这里用到了正则表达式,正则表达式在F#中也是很好用的,我们可以用Regex这个类来处理正则表达式。

open System.Text.RegularExpressions
let removeLastNumber note = 
    let reg = Regex("(.*?)(\d+)$").Match(note)
    if reg.Success
    then Some (List.tail [for x in reg.Groups -> x.Value])
    else None

这样我们就可以把每个注释对应的音频文件命名为note-数字.wav,这样就可以把音频文件和注释对应起来了。

插入音频的代码也很简单:

open System.IO
let insertAudio (slide:ShapeCrawler.ISlide) (fn:string) =
    use stream =  File.Open(fn, FileMode.Open)
    let audio = slide.Shapes.AddAudio(10, 10, stream)
    slide

这里还是用到了use的语法,这样才能在函数结束后自动释放文件句柄。

尚未实现的功能

这个玩意我从昨晚开始打主意,没动手。早上开始整,10点不到就整完了,还是很有效率。

还有几个功能不太满意,找了一下没有轮子,就没有实现。

  1. 自动把音频设置为自动播放;
  2. 自动把音频设置为隐藏;
  3. 自动把PPT导出为MP4文件。

这几个功能应该可以用Office.Interop来实现,那就要求机器上装了Office,是不是还得看版本,算了,就当活动手臂,自己点吧。文章来源地址https://www.toymoban.com/news/detail-704607.html

总结

  1. .NET平台人才济济,个个说话都很好听;
  2. 我们先来把这篇文章的内容做个PPT,然后转成视频吧……

到了这里,关于F#奇妙游(29):PPTX注释变音频插入页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(19)
  • 音视频开发:音频编码原理+采集+编码实战

    音视频开发:音频编码原理+采集+编码实战

    消除冗余信息,压缩量最大,也叫有损压缩 剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上; 去除被掩蔽的音频信号,信号的遮蔽可以分为频域遮蔽和时域遮蔽; 频域遮蔽效应 屏蔽70分贝以下,20HZ以下,20000HZ以上 屏蔽分贝小,频率小的声音 两个频率相近发出的声音,

    2024年02月05日
    浏览(11)
  • 【音视频 | AAC】AAC格式音频文件解析

    【音视频 | AAC】AAC格式音频文件解析

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍AAC格式音频文件解析🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 本文未经允许,不得转发!!

    2024年02月04日
    浏览(13)
  • 音视频八股文(11)-- ffmpeg 音频重采样

    音视频八股文(11)-- ffmpeg 音频重采样

    所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 为什么要重采样?当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频的时候,不同的⾳源有不同的格式,采样率等,在解码后的数据中的这些参数也会不⼀致(最

    2024年02月04日
    浏览(11)
  • Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流

    2024年02月10日
    浏览(18)
  • qt+ffmpeg 实现音视频播放(二)之音频播放

    qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(18)
  • Android音视频处理技术:音频混音与播放

    作者:禅与计算机程序设计艺术 在现代生活中,我们都会听到各种各样的声音。但是有的声音会相互抵消影响我们的正常生活,而有的声音则会增加我们的情绪快乐。人类为了能够真正体验到声音带来的快感,需要将不同类型的声音合并,再将它们再传达给大脑。音频混音与

    2024年02月08日
    浏览(10)
  • Qt 多媒体音频模拟按钮发音(音视频启动)

    Qt 多媒体音频模拟按钮发音(音视频启动)

    ## 项目演示 平台 :windows或者ubuntu  要求 :平台需要支持音频播放功能 文件格式 :.wav 可以使用剪映生成,音频部分,我这里是简短的音乐 # Qt 多媒体简介 Qt QSound是Qt框架中的一个类,用于播放音频文件。它可以在Qt应用程序中实现简单的音频播放功能,包括播放、暂停和停

    2024年02月03日
    浏览(11)
  • 音视频开发系列(10):基于qt的音频推流

    音视频开发系列(10):基于qt的音频推流

    今天分享一下利用qt录制音频,然后再利用ffmpeg推流到nginx服务器,最后再利用vlc进行拉流的demo。 首先介绍一下如何利用qt来进行音频的录制,qt的音频录制主要利用qt的QAudioFormat先进行音频信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo来获取是否支持改设置

    2024年02月02日
    浏览(12)
  • 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装播放流程 )

    【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装播放流程 )

    本篇文件主要分析 音视频文件 是怎么产生的 , 以及 音视频文件是如何播放的 ; 视频文件从录像到生成文件的全过程 : 采集图像帧 : 摄像头 硬件 负责 采集画面 , 采集的 初始画面 称为 \\\" 图像帧 \\\" , 一秒钟 采集 的 图像帧 数量 称为 \\\" 帧率 \\\" , 如 : 60 帧 就是 一秒钟采集 60 个画

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包