【Wolfram语言】46 音频与视频

音频与视频

词汇表

函数 说明
AudioCapture[] 从计算机麦克风捕获音频
AudioPlot[audio] 绘制音频强度
Spectrogram[audio] 从音频生成声谱图
AudioPitchShift[audio, r] 将音频移调
SpeechRecognize[audio] 识别音频中的单词
Speak["字符串"] 让计算机朗读字符串
SpeechSynthesize["字符串"] 合成语音音频
AudioIdentify[audio] 识别音频内容
VideoCapture[] 从摄像头捕获视频
VideoFrameList[video, n] 从视频生成帧列表
VideoMapTimeSeries[f, video] 将函数应用于视频的每一帧
AnimationVideo[expr, {t, min, max}] 通过动画生成视频

音频

12节 中我们看到 Wolfram 语言如何处理由音符组成的声音。

实际上它可以处理任何类型的音频,例如人声。

捕获音频

AudioCapture 可以从计算机的麦克风捕获音频。

捕获我说"不合逻辑的"短语 a cat, a dog, a squid

wl 复制代码
In[]:=AudioCapture[]


盒子表示你捕获的音频。

可以通过按播放按钮来播放。

还有许多对音频进行操作的函数。

波形图

例如,可以使用 AudioPlot 绘制音频强度。

将音频强度随时间绘制为图:

在此图中,大致可以区分出不同的单词。

频谱图

更详细的可视化方式是使用声谱图。

为音频生成声谱图:

声谱图有点像广义的乐谱,其中在某一音高处强度越高显示越暗。

语音识别

不同的语音或音素在声谱图中表现为不同的结构。
SpeechRecognize 试图分析整个声谱图以识别单词。

对于较长的音频,需要大量计算,因此可能需要一些时间。

识别音频中所说的内容:

wl 复制代码
Out[]=a cat, a dog, a squid

变调

将音高按 2 倍(即一倍八度)移位,会使我的声音变高、滑稽。

其声谱图会被拉伸。

为移调后的音频生成声谱图:

SpeechRecognize 无法正确识别所说内容:

wl 复制代码
Out[]=I can't. I don't. I Scream.

语音合成

Wolfram 语音不仅能识别语音,也能生成语音。
Speak 让计算机发声,SpeechSynthesize 给出明确的音频。

从文本合成语音并生成其声谱图:

复制代码
In[]:=Spectrogram[SpeechSynthesize["a cat, a dog, a squid"]]

计算机合成语音的声谱图与我的声音声谱图在某种程度上相似。

大多数计算机上,SpeechSynthesize 可以访问多种具有不同口音的声音,通常以名字描述。

使用不同口音的声音:

复制代码
In[]:=Spectrogram[SpeechSynthesize["a cat, a dog, a squid", #]] & /@ {"Tessa", "Juan",  "Luca", "Lekha"}

桌面版和网页版的可用声音样式不一样,可通过$VoiceStyles查询。

声音和音符

也可以从我们在第 12 节讨论的 Sound 对象生成音频。

在合成钢琴上按顺序演奏若干、跨八度的音符:

复制代码
In[]:=Sound[Table[SoundNote[12 n, 1, "Piano"], {n, 4}]]
Out[]=

对应的音频图,较高音调的音符衰减更快:

复制代码
In[]:=AudioPlot[Sound[Table[SoundNote[12 n, 1, "Piano"], {n, 4}]]]

以及其声谱图:

复制代码
In[]:=Spectrogram[Sound[Table[SoundNote[12 n, 1, "Piano"], {n, 4}]]]

合成小提琴的相应声谱图:

复制代码
In[]:=Spectrogram[Sound[Table[SoundNote[12 n, 1, "Violin"], {n, 4}]]]

类似ImageIdentify 函数,用于音频的是 AudioIdentify

AudioIdentify 将音频识别为小提琴:

复制代码
In[]:=AudioIdentify[Sound[Table[SoundNote[12 n, 1, "Violin"], {n, 4}]]]

视频

Wolfram 语音不仅处理音频,也处理视频。VideoCapture 可以从计算机摄像头捕获视频。

视频捕获

摄像头捕获视频:

复制代码
In[]:=video=VideoCapture[]

视频帧列表

从视频中获取帧列表作为图像:

wl 复制代码
In[]:=VideoFrameList[video, 6] // ImageCollage

提取音频

从视频中提取音轨并识别我说的话:

wl 复制代码
In[]:=SpeechRecognize[Audio[video]]
Out=Hello there, let me introduce you to my spiky friend.

视频映射时间序列

计算视频过程中红、绿、蓝的平均值:

wl 复制代码
In[]:=ListLinePlot[VideoMapTimeSeries[Mean[#Image] &, video], PlotStyle -> {Red, Green, Blue}]

动画视频

除了直接捕获视频外,还可以从文件获取或从服务器流式传输。

也可以使用程序创建视频。

AnimationVideo 类似于 Manipulate,但会自动动画化并生成视频。

视频通常包含大量数据,可能需要较长时间生成。

生成一个黑盘在黄色盘内"生长"的视频:

wl 复制代码
In[]:=AnimationVideo[
 Graphics[{Style[Disk[{0, 0}, 1], Yellow], 
   Style[Disk[{0, 0}, a], Black]}, ImageSize -> 100], {a, 0, 1}]

将视频保存为 .mp4 文件:

wl 复制代码
In[]:=Export["blob.mp4",%]

Manipulate 一样,可以在 AnimationVideo 中指定步长。

生成一个有 110 个扇区的饼图视频:

wl 复制代码
In[]:=AnimationVideo[PieChart[Table[1, n], ImageSize -> 100], {n, 1, 10, 1}]

下一步

写好代码

相关推荐
qq_2518364571 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理2 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长3 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
weixin_307779135 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
2601_966949655 小时前
为什么量化回测中 for 循环比 DataFrame 慢三个数量级?从向量化原理讲起
开发语言·python·pandas·股票数据·quantdash
边境悍匪7 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao7 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob2337 小时前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab