輕松擁有整點(diǎn)報(bào)時(shí)功能
最近蘇州疫情比較緊,人宅在家里就比較容易無(wú)聊。媳婦打發(fā)無(wú)聊的方法就是逛淘寶,逛小紅書(shū),逛阿里巴巴。不知道是被哪位博主種草了天貓精靈,打算拔草一個(gè)。
我是不太喜歡語(yǔ)音控制這類(lèi)東西的。一是我更喜歡文字,不喜歡發(fā)語(yǔ)音,還有就是語(yǔ)音識(shí)別的準(zhǔn)確性不太高,有很多誤識(shí)別,需要重復(fù)說(shuō)兩三遍的時(shí)候就會(huì)覺(jué)得自己很蠢。身邊監(jiān)控我們?nèi)粘5碾娮赢a(chǎn)品已經(jīng)很多了,不想再多一個(gè)產(chǎn)品監(jiān)聽(tīng)我的日常。所以我果斷拒絕了這一想法。
媳婦又打起了感情牌,說(shuō)是可以給娃播放早教音樂(lè),放在柜子上看時(shí)間也比較方便?!坝惺謾C(jī)還要天貓精靈看時(shí)間么”,我當(dāng)時(shí)就小聲嘀咕了。至于放歌這一需求,手機(jī)電腦都好放的,家里也有藍(lán)牙音箱。于是我決定自己動(dòng)手做一下山寨低配簡(jiǎn)化的天貓精靈。

掏出幾年前也是閑得無(wú)聊的時(shí)候買(mǎi)的藍(lán)牙音箱。長(zhǎng)這樣,熄屏的時(shí)候,表面是一面鏡子,可以照出我胡子拉碴的盛世美顏。
功能需求分為2塊,整點(diǎn)報(bào)時(shí)和播放兒歌。播放功能基本不用做,藍(lán)牙自帶控制功能,主要解決整點(diǎn)報(bào)時(shí)。整點(diǎn)對(duì)于python來(lái)說(shuō)太簡(jiǎn)單了,time模塊和datetime模塊都可以解決。1s獲取一次最新的時(shí)間,約等于有個(gè)時(shí)鐘。每次判斷一下時(shí)鐘和分鐘的值是不是都是0就行了。接下來(lái)要解決報(bào)時(shí),得有處理好的音頻,還有用python播放語(yǔ)音。之前沒(méi)有處理過(guò)音頻文件,于是上網(wǎng)搜,小手一抖,找到個(gè)現(xiàn)成的??梢杂胮yaudio庫(kù)來(lái)實(shí)現(xiàn)。于是整點(diǎn)報(bào)時(shí)的代碼就變成了:
?如果你要使用的話,只要?jiǎng)?chuàng)建個(gè)文件夾,里面放制作好的音頻,同時(shí)修改第32行,filename即可。眼瞅著需求實(shí)現(xiàn)大差不差了,只見(jiàn)甲方爸爸刷著劇,絲毫沒(méi)有要提供音頻文件的意思。我說(shuō)你見(jiàn)過(guò)哪個(gè)甲方不給錢(qián)提需求,連素材都不提供的么。媳婦淡淡來(lái)了一句,甲方不都是這么干的么。深諳需求管理,都怪我之前給她講PM的故事講太多了。沒(méi)有困難的工作,只有勇敢的卷順。python嘛,網(wǎng)上找找?guī)煜取9徽业揭粋€(gè),3行代碼解決了音頻剪輯的問(wèn)題,其中還有一行是導(dǎo)入包。行啊。簡(jiǎn)潔優(yōu)雅美麗大方。import time # 獲取時(shí)間import wave # 波形處理import pyaudio # 播放器def play_sound(filename):f = wave.open(filename, 'rb') # 加載音頻文件(wav)pms = f.getparams() # 獲取音頻的屬性參數(shù)nchannels, sampwidth, framerate, nframes = pms[:4] # 單獨(dú)提取出各參數(shù)的值,并加以定義p = pyaudio.PyAudio() # 創(chuàng)建一個(gè)播放器s = p.open(format=p.get_format_from_width(sampwidth), channels=nchannels, rate=framerate, output=True) # 將音頻轉(zhuǎn)換為音頻流while True:data = f.readframes(1024) # 按照1024大小的塊,讀取音頻數(shù)據(jù),得到一系列二進(jìn)制編碼if data == b'':breaks.write(data) # 開(kāi)始按照音頻的參數(shù),播放音頻s.close()p.terminate()if __name__ == '__main__':while True:t = time.strftime("%H:%M:%S", time.localtime())print(t)time_list = t.split(':')# time_list[0] 小時(shí)# time_list[1] 分鐘# time_list[2] 秒if time_list[1] == '00' and time_list[2] == '00':hour = int(time_list[0])if 6 <= hour < 23:filename = "baoshi/{}.wav".format(hour) # 找到對(duì)應(yīng)的wav文件路徑play_sound(filename) # 播放聲音time.sleep(1)
實(shí)際試了一下,有點(diǎn)小問(wèn)題,需要先安裝一下FFmpeg工具。下載地址放這里https://ffmpeg.org/download.html#build-windows。下載到本地后,把bin文件所在目錄添加到環(huán)境變量里,在命令行輸入ffmpeg,沒(méi)有報(bào)錯(cuò)則添加成功。from pydub import AudioSegmentsong = AudioSegment.from_mp3("end_of_time.mp3")song[33*1000:70*1000].export('end_of_time_slice.mp3')?

再次運(yùn)行上面的3行代碼就沒(méi)有問(wèn)題。其中33*1000:70*1000就是提取33s到70s這一段音頻。于是網(wǎng)上找了個(gè)報(bào)時(shí)的音頻,開(kāi)始?xì)g快的截起歌來(lái)。
按照以往的合作模式,甲方爸爸一直是要源碼研究的,雖然我說(shuō)過(guò)要源碼得加錢(qián),但是并沒(méi)有用。出于碼農(nóng)的職業(yè)道德,我還是把這段代碼封裝一下,再加上中文注釋,方便甲方爸爸閱讀。
from pydub import AudioSegmentdef edit_music_signle(name, new_name, start, end=0):# 打開(kāi)文件名是name的文件song = AudioSegment.from_mp3(name)# 如果沒(méi)有輸入結(jié)束時(shí)長(zhǎng)if end == 0:# 就使用歌曲的默認(rèn)長(zhǎng)度end = len(song)# 歌曲從start到end這部分導(dǎo)出為new_name的文件,格式是wav????song[start:end].export(new_name,?format="wav")????edit_music_signle('報(bào)時(shí).mp3', '23.wav', 207000, 217500)
把整點(diǎn)報(bào)時(shí)的分鐘和秒鐘改成現(xiàn)在時(shí)間再多幾十秒,簡(jiǎn)單測(cè)試了一下,整點(diǎn)報(bào)時(shí)功能可以正常運(yùn)行。
接下來(lái)是播放兒歌的問(wèn)題了。云村一搜兒歌,出來(lái)XX巴士,點(diǎn)開(kāi)聽(tīng),每個(gè)歌開(kāi)頭都有個(gè)軟廣。接下來(lái)就是批量剪輯掉開(kāi)頭的這個(gè)廣告了,python處理批量操作很方便。
先是云村一鍵下載歌單里的歌,然后批量重命名,因?yàn)槊种虚g有空格,文件讀取的時(shí)候會(huì)出錯(cuò)。然后就是剪掉前2s的聲音,再轉(zhuǎn)換成wav格式。pyaudio可以播放wav,能不能播放MP3還沒(méi)研究,先轉(zhuǎn)換成wav使用起來(lái),后面再找MP3的庫(kù)。
from pydub import AudioSegmentimport osdef edit_music(filepath):filenames = os.listdir(filepath)for file in filenames:if file.endswith('mp3'):if ' ' in file:new_name = file.split(' ')[2]else:new_name = fileos.rename(filepath+file, filepath+new_name)song = AudioSegment.from_mp3(filepath+new_name)new_name = new_name.split('.')[0]song[2*1000:len(song)].export('music_cut/{}.wav'.format(new_name), format="wav")????????????edit_music('music/')
一頓操作,兒歌就搞定了,歡快的播放起來(lái)。
再然后呢?因?yàn)槭褂玫氖亲詭У乃{(lán)牙功能,所以功能很有限,如果想實(shí)現(xiàn)更多的功能,那得解析藍(lán)牙數(shù)據(jù)。比如長(zhǎng)按,組合按鍵。當(dāng)然也是有這樣的庫(kù)的,不過(guò)是基于v3.5的python實(shí)現(xiàn)的,我的是3.9版本,需要安裝虛擬環(huán)境去解決。暫時(shí)就先這樣對(duì)付甲方爸爸吧,畢竟咱也沒(méi)打算做成產(chǎn)品級(jí),而且甲方爸爸的新鮮勁兒也不會(huì)超過(guò)一星期。
想看更多python相關(guān)的騷操作,請(qǐng)持續(xù)關(guān)注,也歡迎提需求哦。
- https://blog.csdn.net/u010751000/article/details/106963850??Python 超方便超快速剪輯音樂(lè)
- https://www.yisu.com/zixun/155666.html??Python 實(shí)現(xiàn)整點(diǎn)報(bào)時(shí)的方法
相關(guān)文章:
