程序设计二

完整工程文件:

链接:https://pan.baidu.com/s/1dcoTGhIeDxsRz-RUr2Paxw
提取码:jy48

一:需求分析

实现语音左右声道数据分离

wav2txt -i xxx.wav -o yyy.txt (-R/-L/-all/-mix)

将输入文件xxx.wav的采样数据读出保存在文本文件yyy.txt中。如无-o项则输出到屏幕上。yyy.txt的格式:

所有数据为整数(16bit 0–2^16-1=65565),每行一个采样值。如

1
2
3
4
5
...
100

双声道语音每行两个值,用空格分隔

二:参考知识

1.所需文件知识

转换语音频率和声道数

ffmpeg -i lanTian.mav -ac 2 -ar 16000 -y lanTian2.mav其中:
-ac 1 设置声道数为
-ar 16000 设置采样率为16000Hz

文件信息

lanTian.mav 声道数1 采样率8000
lanTian2.mav 声道数2 采样率16000
BAC009S0003W0121.wav 声道数1 采样率16000

2.sys 模块

在 Python 中,sys 模块是一个非常常用且十分重要的模块,通过模块中的 sys.argv 就可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表(list),

参数个数: len(sys.argv)
脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
options, args = getopt.getopt(args, shortopts, longopts=[])
参数args:一般是sys.argv[1:]。过滤掉sys.argv[0],它是执行脚本的名字,不算做命令行参数。
参数shortopts:短格式分析串。例如:"hp:i:",h后面没有冒号,表示后面不带参数;p和i后面带有冒号,表示后面带参数。
参数longopts:长格式分析串列表。例如:["help", "ip=", "port="],help后面没有等号,表示后面不带参数;ip和port后面带冒号,表示后面带参数。返回值options是以元组为元素的列表,每个元组的形式为:(选项串, 附加参数),如:('-i', '192.168.0.1')返回值args是个列表,其中的元素是那些不含'-'或'--'的参数。

3.参考文章

https://blog.csdn.net/ouyang_peng/article/details/79390920
http://www.eemaker.com/python-wav-pcm.html
https://www.cnblogs.com/LXP-Never/p/10078200.html
https://www.jianshu.com/p/e568f94cdf6a
https://blog.csdn.net/Samaritan_x/article/details/84146029
https://blog.csdn.net/qinglingLS/article/details/83218638
https://blog.csdn.net/sinat_33588424/article/details/80239375

三:python代码

holiday02.py
import wave
import numpy as np
import sys
import getoptdef main(argv):"""通过 getopt模块 来识别参数demo"""try:"""options, args = getopt.getopt(args, shortopts, longopts=[])参数args:一般是sys.argv[1:]。过滤掉sys.argv[0],它是执行脚本的名字,不算做命令行参数。参数shortopts:短格式分析串。例如:"hp:i:",h后面没有冒号,表示后面不带参数;p和i后面带有冒号,表示后面带参数。参数longopts:长格式分析串列表。例如:["help", "ip=", "port="],help后面没有等号,表示后面不带参数;ip和port后面带冒号,表示后面带参数。返回值options是以元组为元素的列表,每个元组的形式为:(选项串, 附加参数),如:('-i', '192.168.0.1')返回值args是个列表,其中的元素是那些不含'-'或'--'的参数。"""#opts, args = getopt.getopt(argv, "hi:p:rl", ["help", "input=", "password=","right","left"])opts, args = getopt.getopt(argv, "hi:o:lrA", ["help", "input=", "output=","left","right","all"])except getopt.GetoptError:print('双声道:python holiday02.py -i lanTian2.wav -o wavData.txt -l')print('or双声道:python holiday02.py --input=lanTian2.wav --output=wavData.txt --all')print('单身道:python holiday02.py -i BAC009S0003W0121.wav -o wavData.txt')sys.exit(2)# 处理 返回值options是以元组为元素的列表。for opt, arg in opts:if opt in ("-h", "--help"):print('双声道:python holiday02.py -i lanTian2.wav -o wavData.txt -l')print('or双声道:python holiday02.py --input=lanTian2.wav --output=wavData.txt --all')print('单身道:python holiday02.py -i BAC009S0003W0121.wav -o wavData.txt')sys.exit()elif opt in ("-i", "--input"):input = argelif opt in ("-o", "--output"):output = argf = wave.open(input, 'rb')params = f.getparams()  # get wave file paramsnchannels, sampwidth, framerate, nframes = params[:4]print("wav params is :", params)# open a txt file#file = open("wavData.txt", 'w')file = open(output, 'w')data = f.readframes(nframes)# 将字符串转换为数组,得到一维的short类型的数组data = np.fromstring(data, dtype=np.short)# 整合左声道和右声道的数据data = np.reshape(data, [nframes, nchannels])j=0#用j来判断左右声道数据length=len(data)#该段语音有多少个采样点#左声道j=0elif opt in ("-l", "--left"):#data=data[:,0]j=0elif opt in ("-r", "--right"):#data=data[:,1]j=1#右声道j=1elif opt in ("-A", "--all"):for i in range(length):# s = str(data[i, 0]).replace('[', ").replace('[',")#同时打印左右声道数据,中间空格分开s = str(data[i, 0]).replace('[', ").replace('[',")+' '+str(data[i, 1]).replace('[', ").replace('[',")s = s.replace("'", ").replace(',',") + '\n'  # 去除单引号,逗号,每行末尾追加换行符file.write(s)file.close()f.close()exit()#为了不影响下面的,如若没有exit,打完双声道左右数据,还会打印单声道一列数据#file.close()'''在这里需要考虑到左右声道数据同时打印在txt文件,和分别打印,只定义j没能实现,定义了两次for循环将file和f关闭,防止下面打印左右声道又关闭依次,不然报错ValueError: I/O operation on closed file.'''#f.close()  # close wave file#breakfor i in range(length):# s = str(bins[i,0]).replace('[',").replace('[',")+'\t'+str(data[i]).replace('[',").replace('[',")#去除[],这两行按数据不同,可以选择# s = str(data[i, 0]).replace('[', ").replace('[',")s = str(data[i,j]).replace('[', ").replace('[',")s = s.replace("'", ").replace(',',") + '\n'  # 去除单引号,逗号,每行末尾追加换行符file.write(s)file.close()f.close()  # close wave fileif __name__ == "__main__":# sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。main(sys.argv[1:])#python holiday02.py -i BAC009S0003W0121.wav
#python holiday02.py -i lanTian2.wav -l
#python holiday02.py -i lanTian2.wav -o wavData.txt -l

四:实现结果

1.请求帮助

python holiday02.py -h
双声道:python holiday02.py -i lanTian2.wav -o wavData.txt -l
or双声道:python holiday02.py --input=lanTian2.wav --output=wavData.txt --all
单身道:python holiday02.py -i BAC009S0003W0121.wav -o wavData.txt

2.单声道

python holiday02.py -i BAC009S0003W0121.wav -o wavData(single).txt

3.左声道数据

python holiday02.py -i lanTian2.wav -o wavData(left).txt -l

4.右声道数据

python holiday02.py -i lanTian2.wav -o wavData(right).txt -r

5.左右声道数据

python holiday02.py -i lanTian2.wav -o wavData(all).txt --all

五:结果对比

以双声道lanTian2.wav,自己实现的数据和matlab对比,打印数据有多少行,值大小情况,结果对比一致

matlab程序

filename='G:\python\holiday\lanTian2.wav';%这个声音文件在该程序根目录
[signal,fs] = audioread(filename,'native');%读取wav文件,读完是去除了文件头的采样点,而且归一化了,是浮点数。
%[signal,fs] = audioread(filename)
info=audioinfo(filename)%看这个文件的信息。
whos signal%显示name size bytes class 等等

python实现结果如下


matlab实现结果如下

ead(filename,‘native’);%读取wav文件,读完是去除了文件头的采样点,而且归一化了,是浮点数。
%[signal,fs] = audioread(filename)
info=audioinfo(filename)%看这个文件的信息。
whos signal%显示name size bytes class 等等

matlab实现结果如下

音频处理二:(左右声道分离)相关推荐

  1. PCM音频处理(1)——分离声道、以及声音处理

    文章目录 一.声道分离 二.对左边声道进行降半处理 一.声道分离 #include <stdio.h> #include <stdlib.h>int pcm16_split(c ...

  2. 【C语言】PCM音频数据处理---左右声道分离

    我用一麦克风录制的PCM数据是16bit,双声道的,用Audacity工具查看可知,右声道是没有声音的,左声道才有声音,如下图所示 所以为了节省存储空间,完全可以将左右声道分离出来,左右声道分离的方法 ...

  3. java实现声道分离,使用Java分离音频左右声道

    使用Java分离音频左右声道 1.音频属性相关 音频采样所得的PCM都含有三个要素:声道(channel).采样率(sample rate).采样位数.时长. 1.1.声道 记录声音时,如果每次生成一 ...

  4. ffmpeg 音频解码二

    1. ffmpeg 视频解码一 2. ffmpeg 视频解码二 3. ffmpeg 音频解码一 4. ffmpeg 音频解码二 5. ffmpeg 音视频解码 6. ffmpeg 视频编码一 7. f ...

  5. PCM裸流数据的16进制格式以及左右声道分离c语言程序

    前言 本文讲解PCM裸流数据的存储格式. 本文PCM音频参数 声道数: 2采样位数: little endian signed 16 bits,小端有符号字 = short,表示范围 -32768~3 ...

  6. 理解 Audio 音频系统二 之 audioserver AudioPolicyService

    理解 Audio 音频系统二 之 AudioPolicyService 二.audioserver & AudioPolicyService + AudioPolicy 启动流程总结 1. A ...

  7. 华为音频编辑服务,实时分离人声、伴奏和乐器声

    想获取一首歌的伴奏却找不到资源怎么办?没关系,我们可以自己解决.音频编辑服务提供音源分离的功能,帮助开发者在应用中构建人声与伴奏分离的功能. 目前,音源分离功能已经开放了人声与伴奏.乐器等多种分离的方 ...

  8. RK3328 Android 7.1 录音左右声道分离的情况下,有时候会出现,右声道的声音和左声道一样的问题

    RK3328 Android 7.1 录音左右声道分离的情况下,有时候会出现,右声道的声音和左声道一样的问题 问题现象: 产品有语音识别功能,需要回音消除,所以立体声录音需要左右声道分离,左声道为主M ...

  9. Android音频开发之视频音频视频分离与合成

    本文主要记录java层视频的音频轨和视频轨分离与合成 主要是使用Google提供给我们的方法MediaExtractor:分离音频视频  MediaMuxer:合成音频视频 直接上测试代码 : 分离音 ...

最新文章

  1. 支付宝接口调用问题快速通道
  2. 学生、课程、分数的设计(重要)
  3. 2018-2019-1 20165335 《信息安全系统设计基础》第六周学习总结
  4. 使用Mockito进行Java单元测试
  5. boost::phoenix::function相关的测试程序
  6. LeetCode 26.删除排序数组中的重复项
  7. 微机原理控制转移类指令
  8. CV Code|计算机视觉开源周报20200601期
  9. 让oracle跑得更快——oracle 10g性能分析与优化思路,[让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1.doc...
  10. azure java_使用 Java 的 Azure 存储示例 | Microsoft Docs
  11. 简述div标签和span标签的不同_div与span的区别是什么?
  12. UI设计师必备|Web设计尺寸规范
  13. 部署Extmail邮件系统需注意几点
  14. C. Banh-mi
  15. 多元线性回归拟合公式
  16. 2021年中国彩电行业发展现状分析,零售量首度跌破4000万大关,行业迎来艰难时刻「图」
  17. 三线npn型接近开关与三菱plc输入端子接线方法
  18. Zotero安装配置插件教程: 多端同步、自动翻译、抓取题录信息、参考文献等
  19. 未来计算机 教学反思,计算机基础教学反思.doc
  20. WINCE6.0去掉桌面快捷方式

热门文章

  1. scratch学算法3-冒泡排序
  2. Huawei华为交换机基本配置命令
  3. mysql和postsql分页数据的区别
  4. Visual Basic 6.0 中文企业版
  5. 《概率论与数理统计》复习笔记
  6. 哪位能推荐一下广州比较好的IT公司啊,不尽感激
  7. 输出一个区间内所有的素数(质数)
  8. 基于EtherNet/IP实现欧姆龙NX系列PLC通信
  9. 【Docker】配置镜像加速器(以腾讯云为例)
  10. 武汉理工大学软件测试重点,软件测试实验报告书(武汉理工大学).docx