python:如何播放 .spx 声音文件

.spx 是 Speex音频编解码器的文件扩展名,它是一种开源的、免费的音频编解码器,主要用于语音压缩和语音通信领域。spx 文件通常用于语音记录、VoIP应用、语音信箱等场景。

.mp3 是一种广泛使用的音频格式,它采用了有损压缩算法,可以在保持较高音质的同时减小文件大小。mp3文件可以在各种设备和平台上播放,包括计算机、移动设备、音频播放器等。

FFmpeg 可以将.spx文件转码成.wav文件,基于 pyaudio 和 wave 实现播放.wav 声音文件。

where ffmpeg

D:\FFmpeg\64\ffmpeg.exe

#-- 转换.spx 到 .wav:

ffmpeg -i input.spx -acodec pcm_s16le output.wav

#-- 转换.wav 到 .mp3:

ffmpeg -i input.wav -f mp3 output.mp3

pip install pyaudio

pip install wave

编写 play_spx.py 如下

python 复制代码
# -*- coding: utf-8 -*-
""" 播放 *.spx 音频文件 """
import os
import sys
import time
from tkinter import filedialog
import pyaudio
import wave

# main()
f1 = ''
if len(sys.argv) ==1:
    filetypes = [('spx file','.spx'),('ogg file','.ogg')]
    f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:
    f1 = sys.argv[1]
else:
    print('usage: python play_spx.py file1.spx')
    sys.exit(1)

if not os.path.exists(f1):
    print(f"{f1} is not exists.")
    sys.exit(2)

fn,ext = os.path.splitext(f1)
if ext.lower() not in ('.spx','.ogg'):
    print('ext is not (.spx , .ogg )')
    sys.exit(2)

f2 = fn +'.wav'
if not os.path.exists(f2):
    os.system(r"D:\FFmpeg\64\ffmpeg.exe -i %s -acodec pcm_s16le %s" % (f1,f2))
else:
    print(f"{f2} is exists")

# 初始化 PyAudio
p = pyaudio.PyAudio()
        
def play_wav(filename):
    # 打开 WAV 文件
    wf = wave.open(filename, 'rb')
    # 打开音频流
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                         channels=wf.getnchannels(),
                         rate=wf.getframerate(), output=True)

    chunk = 1024
    data = wf.readframes(chunk)
    while data :
        stream.write(data)
        data = wf.readframes(chunk)

    stream.stop_stream()
    stream.close()
    wf.close()

print(f2)
#time.sleep(1)
time1 = time.time()
# 播放音频
play_wav(f2)
time2 = time.time()
print("run time: %.3f s" % (time2-time1))

运行 python play_spx.py

参阅:pyaudio:基于pyaudio和pydub 实现一个简易音乐播放器播放wav、mp3等格式音乐


安装 pip install pygame

pygame 能播放*.mid , *.mp3 , *.wav ,编写 play_mid.py 如下:

python 复制代码
# -*- coding: utf-8 -*-
import os
import sys
import time
from tkinter import filedialog
import traceback
import pygame
from pygame import mixer

def mixer_init():
    freq = 44100
    bitsize = -16
    channels = 2
    buffer = 2048
    mixer.init(freq, bitsize, channels, buffer)
    # optional volume 0 to 1.0
    mixer.music.set_volume(0.9)

def play_mid(file):
    if mixer.music.get_busy():
        mixer.music.fadeout(1000)
        mixer.music.stop()
    clock = pygame.time.Clock()
    try:
        mixer.music.load(file)
    except:
        print(traceback.format_exc())
    mixer.music.play()
    while mixer.music.get_busy():
        clock.tick(30)

# main()
f1 = ''
if len(sys.argv) ==1:
    filetypes = [('mid file','.mid'),('mp3 file','.mp3'),('wav file','.wav')]
    f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:
    f1 = sys.argv[1]
else:
    print('usage: python play_mid.py file1.mid')
    print('usage: python play_mid.py file1.mp3')
    print('usage: python play_mid.py file1.wav')
    sys.exit(1)

if not os.path.exists(f1):
    print(f"{f1} is not exists.")
    sys.exit(2)

fn,ext = os.path.splitext(f1)
if ext.lower() not in ('.mid','.mp3','.wav'):
    print('.ext is not (.mid , .mp3','.wav')
    sys.exit(2)

time1 = time.time()
print(f1)
mixer_init()
try:
    play_mid(f1)
except KeyboardInterrupt as ex:
    # if user hits Ctrl+C then exit
    # (works only in console mode)
    mixer.music.fadeout(1000)
    mixer.music.stop()
    raise SystemExit from ex
mixer.music.stop()
time2 = time.time()
print("run time: %.3f s" % (time2-time1))

运行 python play_mid.py output.wav

相关推荐
计算机毕业编程指导师10 分钟前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
计算机毕业编程指导师18 分钟前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放
浔川python社23 分钟前
浔川社团关于产品数据情况的官方通告
python
生活很暖很治愈25 分钟前
GUI自动化测试[3]——控件&数鼠标操作
windows·python·功能测试·测试工具
老蒋每日coding36 分钟前
Python3基础练习题详解,从入门到熟练的 50 个实例(一)
开发语言·python
HAPPY酷42 分钟前
构建即自由:一份为创造者设计的 Windows C++ 自动化构建指南
开发语言·c++·ide·windows·python·策略模式·visual studio
瑶池酒剑仙44 分钟前
Libvio.link爬虫技术解析大纲
爬虫·python
喵手1 小时前
Python爬虫实战:构建 Steam 游戏数据库:requests+lxml 实战游戏列表采集与价格监控(附JSON导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集steam商店游戏列表数据·sqlite数据库存放采集数据·价格监控游戏推荐市场分析
老蒋每日coding1 小时前
LangGraph:从入门到Multi-Agent超级智能体系统进阶开发
开发语言·python
岚天start1 小时前
Python HTTP服务器添加简单用户名密码认证的三种方案
服务器·python·http