如何将您在 python 中创建的 .wav 文件保存到指定目录?

Posted

技术标签:

【中文标题】如何将您在 python 中创建的 .wav 文件保存到指定目录?【英文标题】:How to save a .wav file you created in python to a specify directory? 【发布时间】:2021-06-04 13:57:58 【问题描述】:

我制作了一个程序,该程序应该记录我家中的人谈话 1 分钟。我认为我的代码已经成功(尽管很混乱)能够保存 *.wav 文件并对录音进行性别分类。男性录音应该保存在male_voices文件夹中,女性录音应该保存在female_voices文件夹中。

我的问题是:我已经搜索过,但似乎找不到将这些录音保存到特定文件路径的方法。如您所见,我尝试使用

os.join(path, "son.wav")

但它不起作用。

我的代码如下:

# import required libraries
import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv
import os
male_members ='s':'son', 'b':'brother', 'u':'uncle', 'f':'father', 'n':'nephew', 'mc':'male cousin', 'o':'other'
female_members ='d':'daughter', 's':'sister', 'a':'aunt', 'm':'mother', 'n':'niece', 'fc':'female cousin', 'o':'other'
# Sampling frequency
freq = 44100

# Recording duration
duration = 60

while True:
    user = str(input("Do you want to record a female [f] or male [m] voice or exit[e]? "))
    if user.lower() == 'm':
        path = r"C:\Users\core i5\Desktop\GitHub\DataSci\Data Analysis and Tools\Dataset\male_voices"
        male = str(input("Are you recording your son[s], brother[b], uncle[u], father[f], nephew[n], male cousin[mc], or other[o]? "))
        recording = sd.rec(int(duration * freq), samplerate=freq, channels=2)
        sd.wait(60)
        sound_name = f"male_members[f'male'].wav"
        wv.write(sound_name, recording, freq, sampwidth=2)
        os.path.join(path, sound_name)

    elif user.lower() == 'f':
        path = r"C:\Users\core i5\Desktop\GitHub\DataSci\Data Analysis and Tools\Dataset\female_voices"
        female = str(input("Are you recording your daughter[d], sister[s], aunt[a], mother[m], niece[n], female cousin[fc], or other[o]? "))
        recording = sd.rec(int(duration * freq), samplerate=freq, channels=2)
        sd.wait(60)
        sound_name = f"female_members[f'female'].wav"
        wv.write(sound_name, recording, freq, sampwidth=2)
        os.path.join(path, sound_name)

    elif user.lower() == 'e':
        print("exiting program....")
        break

    else:
        print("Unrecognized command. Try again\n")
        continue

任何帮助将不胜感激

【问题讨论】:

为了进一步澄清,上面的代码发生了什么?您收到错误还是没有保存在正确的目录中? 您正在调用os.path.join(path, sound_name),但没有在任何地方使用返回值!试试wv.write(os.path.join(path, sound_name), recording, freq, sampwidth=2) @PaulBurkart 代码的工作原理是使用正确的家庭“名称”(如 son.wav)创建 .wav。女儿.wav ...但该文件保存在执行代码的文件夹中。我想更改它,以便将录音保存到代码中提到的路径文件中。 @JustinEzequiel 天哪,它奏效了!谢谢!但它是如何工作的?据我所知,第一个参数应该只用于命名录音。所以它也被用来指导.wav文件的去向? 其他人可以比我更好地解释它,但是当您将文件名指定为(例如)/test/file.txt 时,它只是将其附加到当前工作目录中。因为正斜杠表示一个目录,所以它被自动解释为这样。文件本身的实际名称是“file.txt”,但您更多的是指定其绝对路径,而不仅仅是文件名。 【参考方案1】:

正如贾斯汀所说,您没有在任何地方分配 os.path.join 的返回值。这将创建一条路径,但如果您不对其进行任何操作,则不会发生任何事情。

你必须使用.write()函数将文件写入os.path.join返回值。

这段代码应该可以工作。

# import required libraries
import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv
import os
male_members ='s':'son', 'b':'brother', 'u':'uncle', 'f':'father', 'n':'nephew', 'mc':'male cousin', 'o':'other'
female_members ='d':'daughter', 's':'sister', 'a':'aunt', 'm':'mother', 'n':'niece', 'fc':'female cousin', 'o':'other'
# Sampling frequency
freq = 44100

# Recording duration
duration = 60

while True:
    user = str(input("Do you want to record a female [f] or male [m] voice or exit[e]? "))
    if user.lower() == 'm':
        path = r"C:\Users\core i5\Desktop\GitHub\DataSci\Data Analysis and Tools\Dataset\male_voices"
        male = str(input("Are you recording your son[s], brother[b], uncle[u], father[f], nephew[n], male cousin[mc], or other[o]? "))
        recording = sd.rec(int(duration * freq), samplerate=freq, channels=2)
        sd.wait(60)
        sound_name = f"male_members[f'male'].wav"
        wv.write(os.path.join(path, sound_name), recording, freq, sampwidth=2)
        
    elif user.lower() == 'f':
        path = r"C:\Users\core i5\Desktop\GitHub\DataSci\Data Analysis and Tools\Dataset\female_voices"
        female = str(input("Are you recording your daughter[d], sister[s], aunt[a], mother[m], niece[n], female cousin[fc], or other[o]? "))
        recording = sd.rec(int(duration * freq), samplerate=freq, channels=2)
        sd.wait(60)
        sound_name = f"female_members[f'female'].wav"
        wv.write(os.path.join(path, sound_name), recording, freq, sampwidth=2)

    elif user.lower() == 'e':
        print("exiting program....")
        break

    else:
        print("Unrecognized command. Try again\n")
        continue

os.path.join(path, sound_name) 会返回 “C:\Users\core i5\Desktop\GitHub\DataSci\Data Analysis and Tools\Dataset\male_voices\son.wav”(例如)。因此,通过编写此代码,您所做的只是构建一个字符串并在任何地方都返回它。

【讨论】:

没错。您只是指定文件的绝对路径,其中包括其文件名 好的。我想我现在明白了。 .write() 路径采用从os.path.join(path, sound_name) 创建的文件名,这就是将保存记录(wv.write() 的第二个参数)的位置。我是否也可以假设 .write() 是一种 wavio 方法?一直以来,我一直在想我可以通过单独使用模块 os 以某种方式保存 *.wav 文件......因为这就是我正在寻找的东西。但是我们为什么可以简单地使用 os.path.join(path, "name.txt") 呢?那不会在路径目录中创建一个文本文件吗? os.path.join 所做的只是创建路径本身。仅凭这一点,您就无法创建任何文件。是的,您正在使用 wavio 的 write() 函数,因为您正在导入 wavio as wv 然后调用 wv.write()。来自文档:wavio.write 将 numpy 数组写入 WAV 文件【参考方案2】:

你可以尝试另一个技巧

Import os
curr_dir = os.getcwd()
os.chdir(path)
# perform the write operation with path as filename
os.chdir(curr_dir)

这比其他方法要长一点 但这也是一种你可以尝试的方式

【讨论】:

以上是关于如何将您在 python 中创建的 .wav 文件保存到指定目录?的主要内容,如果未能解决你的问题,请参考以下文章

在python中创建无限WAV文件

在 python 中创建 32 位浮点 wav 文件?

在python中创建的文件应该打印错误消息[重复]

python multiprocessing:如何从子进程修改在主进程中创建的字典?

在 iOS 中,如何从数据中创建音频文件(.wav、.mp3)文件?

我可以从 Python 触发在 KV 文件中创建的屏幕吗?