'commit'
This commit is contained in:
1
DouYin/Transcripts/2026电力市场的变革 #电力_a23e8b30.txt
Normal file
1
DouYin/Transcripts/2026电力市场的变革 #电力_a23e8b30.txt
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
书店公司的店为什么比电网的便宜?书店公司的盈利模式是怎样的?家人们,大家好。讲完结算机制,不少人私信问我,关于售电公司是如何给企业降低电费的问题。今天这期视频用最通俗的语言给大家解释两个问题。第一,书店公司的店为什么便宜?第二,书店公司的盈利模式。首先第一个问题的核心是二者的定价方式不同。电网是电力系统的大动脉,是要稳定市场的,所以它的电价是取整个市场买卖的平均价,要统一定制。相对公平公正,而书店公司更自由简单,就跟发电厂直接批发讲价,力求拿到更低的电价。说白了是一手电,这样书店公司买到手的电价也相对比,电网更廉价。第二个问题,住建公司的盈利模式主要包括以下两个方面。第一方面是电力销售差价。书店公司一般拥有多个用户。电量大,从发电企业购买电力的价格通常更低,因此单个工商业用户通过售电公司买电,存在差价空间,更省钱。另外,还会根据企业的情况,收取一定的售电服务费用。同时,售电公司还兼具增值服务,如能源管理、电力运维、节能咨询等。这些服务可以帮助用户降低用电成本,同时增加输电公司的额外收入。例如能源管理服务,包括能源监测、节能改造和能效提升电力运维服务涉及设备巡检和故障排查监督。遵循服务则帮助用户制定节能方案等等。两个问题的解答,您听明白了吗?我总结了一份售电结算表格带公式,一键生成售电收益,有需要的联系自取。
|
||||
@@ -0,0 +1 @@
|
||||
售电公司就是卖电的,大错特错。他是未来十年最暴力的合法贸易,连国企都抢着进场,因为赚的是国家给的垄断价差。我是高照你的能源行业信息参谋,让你避坑上上当。很多人骂售电公司是二道贩子,但你见过哪个二道贩子,能想这三个特权,国家帮你兜底,所有交易走官方电力交易中心签完合同,电网自动配送结算差价,不用追账钱,直接到账。电网当搬运工,价线运维超表全是电网的活售电公司只做买低价店,卖企业的轻生意,赚垄断让利。过去电网统购统销赚的批零价差,现在国家开放给售电公司,相当于把垄断利润分出来让你赚。这不是普通贸易,是电力体制改革的时代红利。而受限公司的暴利藏在三层利润里,一基础钱电厂让利的价差,售电公司通过交易中心批量买电厂的店卖给企业赚差价。比如一度店赚0.1元,1000万万就是100万,这是躺着赚的钱。2、技术前用电量预测的偏差奖国家会对售电公司的用电量预测准确率奖罚预测准了,拿奖励错了,被罚。总行的公司能靠这部分多赚30%,这是技术壁垒的钱。三未来钱增值服务的未来大钱。光伏安装、储能租赁、碳交易,这些才是售电公司的长期饭票。比如帮企业装光伏,不仅水电费,还能卖碳排放指标赚的比售电本身还多。重点来了,普通人怎么一杯羹,三条赛道任你选,10成本做代理,也叫居间人人推荐。企业和售电公司签约拿佣金,一家企业一年省十万,你拿1到2万,签十家就是10到20万。2、有资金注册售电公司,注册资本2000万起,直接做电力批发商,赚全部价差。3、有关系资源对接,帮电厂找售电公司,帮售电公司,找企业赚居间费。关系变现的最佳方式。好了,你现在了解售电公司了吗?想知道做代理怎么找靠谱的售电公司吗?怎样和和售电公司更高佣金?我是高照,关注我,让你在能源行业避坑少上当。
|
||||
@@ -0,0 +1 @@
|
||||
最近是不是有售电公司给你报三五级36级的超低电价,比市场均价低了一大截。你是不是觉得捡到爆了,先别着急的,先老爷今天必须给你亏一个冷水。在电力市场,饵料越香,狗子往往也越分力,我特别能理解老板们的心情,谁不想把成本降到最低呢?那你想一个最简单的道理,为什么别人都在报4毛,就他敢报0.35元,他是格雷锋吗?还是你觉得你比市场上所有的行家都聪明?那听好了,纯干货,所有低于市场正常水平的报价,其实都离不开这三大地雷震。你看完就知道这么多了。第一颗雷挑战国家底线的违规价,这个你必须要知道,国家为了防止恶性竞争,给市场交易价设了一个价格下限。大部分地区都在0.37元二左右,所有正规的合同都必须在电力交易中心的。官网上进行网签系统呢也会自动校验,低于这个底线的价格,根本就提交不上去。那他为什么还敢报呢?很简单,他压根就没打算。走正规的网签,想跟你搞线下的阴阳合同,那跌个雷真假孙悟空阴阳合同,这是最常见的套路。他拿一份纸质合同给你看,价格漂亮条款又等签约的主体是某某能源机房。那听起来像个大国企,你大的一杯签了,结果呢他回头在交易中心网签的时候,用的主体可能是注册资金最低的某某能源咨询公司。一旦这样来扯皮,交易中心啊指认网签的电子合同,你拿着你那份纸质合同去告状,可能连被告是谁都搞不清楚。那第三个类藏在细节里的魔鬼条款,就算它价格合规,主体一致,也别掉以轻心。我给你点出三个最明显的条款。那第一他报价0.36元,后面用小字写的不含税。第二,合同比价依据当市场偏差超过5%,电价将上浮调整。那第三是口头承诺,年底有盘点,有补贴,但线上的电子合同只字不提,所以在电力交易的世界领域,从来就没有无缘无故的馅饼,只有精心设计的陷阱。一个能让你睡得安稳的透明的价格,远比一个看起来很美的爆价格要值钱的多。
|
||||
@@ -0,0 +1 @@
|
||||
国家电网直接降电费都省事儿,为什么非要搞设定公司来绕圈子,咱们呢,来打个比方,您就明白了。2015年电改后呢,电力系统就像一个大市场。那发电厂呢好比各大品牌厂家,他负责生产商品,也就是生产店,他可以自由卖电,也可以在平台找商家卖电。那电力交易中心呢就像某宝某东平台,让各个商家入驻平台来售卖自己的电力商品。售电公司就是平台上的商家,他负责从不同的厂家进货,也就是从八进厂进店。进货后呢搞各种活动,比如套餐活动,比如附赠增值服务等等。然后把店零售卖给用户。那国家电网呢相当于物流公司,他负责把商品,也就是电安全运输到您家,只收快递费,也就是输配电费。那在这种关系中,难道你会让物流公司给你商品降价吗?不会因为商品价格是由厂家和商家在市场上竞争决定的那电力也一样,这就是为什么要电杆,为什么要搞售电公司一发电厂卷成本,为了把电卖出去降低电价,二售电公司卷价格卷服务。为了吸引客户,争着给优惠。3、用户真正意可以货币三家选便宜,服务好的内价。所以说变改后有了售电公司不是在绕圈子,是为了建立一个健康竞争的电力市场,让咱们企业用电更省钱、更透明、更高效。
|
||||
@@ -0,0 +1 @@
|
||||
用了几十年的风谷电价,2026年开始将正式退场,不是微调,而是彻底的取消。因为国家发改委刚刚发的那份2026年中长期合同签约的通知里面有一句重磅的话,大家都在解读这个事情。原则上直接参与市场的用户不再执行政府规定的固定分时电价。注意,这句话里边有两个关键词,一个是政府规定,一个是固定的。我们现在执行的电价呢,实际上是固定的分时段的这样一个电价。早晚呢我们执行的是高峰电价,也就是中午午夜呢,我们执行的是古殿减价。同时呢风鼓之间的差一般也是固定的,有一个固定的分股系数。如果这两个固定全取消了,那你原来参照固定的风骨时段安排的错峰生产,降低用电成本这件事儿,那就要被取代了。被什么取代呢?灵活的分时电价什么意思呢?不是没有风骨,相反,风骨将变得更真实,更剧烈。中午,光伏大发工厂休息,供大于求的时候,负电价是正常的,但是晚间光伏没有了,但是用电设备全开了,那电价高也是合理的。这个时候电价就不是再被文件给写死了,而是每15分钟的供需关系实时匹配决定的。很多人可能会觉得这是不是太激进了,其实恰恰相反。全球所有成熟的电力市场都没有政府规定的固定风格电价,居民都可以选择动态的电价的套餐。所以你在新闻里面看到说,德国的电价已经涨到了19欧美度的时候,成熟的电力市场它就是这样的店,它就是一个商品涨涨跌跌,供需决定的。大家应该注意到就是近几年我们现在电力市场里边在节假日执行的叫深股电价,就比古店还便宜。这就证明着传统的风骨的这样的划分已经不能充分的反映出电价的实时的供需情况。所以才需要改变让市场来决定这个变化会影响哪些行业。我们简单聊一聊,首当其冲的一定是新能源的发电项目啊,以光伏为首当其冲的,它的收益的不确定性就大大增加了,市场形成了动态的价格机制。对于固定曲线是一个很重大的打击。对于储能而言呢,那就尤甚尤其是工商业储能。因为你的收益模型直接就崩塌掉了,没有固定的存放在时段。那你只有小概率的窗口的区域,但如果你冲错了1个小时,这一天你都可能就白干了。对于这两个公司而言呢,就是明年你要管理用的是多用户,多时段、多仓位的复杂组合,稍有不慎就可能造成亏损。让人欣慰的呢是通知里边提到了叫原则上直接入市的这些大用户,它是执行灵活的分时电价。对于散户而言呢,他现在是鼓励,不是强制,但实际上地方政策调整的已经很明显很快了,陕西基本上就一步到位了。2026年的零售合同是必须挂钩批发发的的分时均价。四川呢是分布执行,过度执行,但是无论是快卖呃,零售电价这种市场化现在已经是板上钉钉的事了。全体用户全面执行分时的灵活定价,最多也就是两年的时间,你觉得呢?
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
今天这期视频,新能源人都得认真听,不然明年可能少赚几十万家人们。2026年市场化交易工作马上开始了。近期,各省陆续发布了机制竞价公告,有人接到有关组织部门的电话,问你的项目是否要参加机制竞价。面对这个问题,突然有人想起来对136号文还不理解,希望丹姐出一期解读视频。今天这期视频我用大白话给你讲透,136号文。另外在本周日上午十点我也会开直播回答各位关于136号文相关的问题。关于136号文,首先得搞明白文件核心就两个事儿。第一是让新能源上网电价全部由市场化说了算。以前咱光伏风电项目要么靠全额保障,发多少电都按固定电价卖,要么是保量保价,一部分店按固定电价走,剩下的才进市场,现在不一样了。新规要求新能源项目的上网电量原则上全部要进入电力市场,电价都得靠交易弹出来交易方式。交易规则在文件里都有明确规定。比如,现货市场的价格限制放宽了。上线会参考当地的工商业尖峰电价下线会考虑你在市场外能拿到的其他收益,不会让你亏的血本无归。可能有人要问了,全靠市场,万一电价跌的太狠,我这电站不得赔本了。别慌,136号文早就想到了这个问题,就有了第二个事儿,专门搞了个新能源可持续发展价格结算机制。简单说就是多退少补的保障。这里得区分两种项目。2025年6月1日前投产的存量项目和之后投产的增量项目。存量项目还得按以前的保障电量来,你可以自主逐年减少保障量,慢慢适应市场增量,项目就不一样了。全省保障电量跟消纳权重挂钩,省内能消纳更多新能源,就能有更多市场化空间。单个项目的保障电量就要通过竞价来争取。其实电价也有讲究,存量项目按现行价格来,而且不能超过煤电基准价,增量项目得靠竞价。所以竞价主体价格从低到高排序,满足全省保障电量总量时,对应的竞价主体的报价即为机制电价,但这个价格不能超过规定的上限。执行期限上,存量项目沿用之前的20年保障期或者全生命周期,可利用小时税两个时间,先到者为准。增量项目则按同类项目回收初始投资的平均时间来定,很合理,一般是十年或者12年。那咱电站的收入到底怎么算?以前是固定电价乘以发电量,现在变成了电力市场内收入加电力市场外收入,市场内收入就是你谈的交易电价乘以上网电量,市场外收入就是机制电价减去市场交易均价乘以机电量。打个比方,你的电站的机制电价是0.4元,每度市场均价是0.35元每度,那每度电就能补0.05元。要是市场均价涨到0.45元每度,那每住店就得扣0.05元,很公平。不过从136号文对于新能源收入的影响上,有几点必须提醒大家,第一,收入波动会变大,午间光伏出力多的时候,市场供过于求,电价可能会低。晚高峰用电多,但光伏不发电,电价又会涨上去。而且西北这类电力宽松的地区电价可能长期偏低,东部负荷中心波动会更大,得提前做好准备。第二,价差补偿只能补行业平均价,没法抹平个体差异,比如别人的电站位置,好运维磅交易策略好,能拿到更高的交易电价。你要是跟不上收入差距只会越来越大。所以找到优秀的运维团队和交易团队也至关重要。总的来说,136号文不是利空。而是逼着新能源行业从靠政策吃饭,转向靠能力赚钱。对于有实力的企业来说,这是抢占市场的好机会。建议大家赶紧研究当地的交易规则,提升交易和运维能力。也可以关注丹姐,每天跟着丹姐的视频学习市场知识和交易技巧。可以把这条视频转发给身边做新能源的朋友,并且预约周日的直播,咱们下期见。嗯。
|
||||
1
DouYin/Transcripts/抖音-记录美好生活.txt
Normal file
1
DouYin/Transcripts/抖音-记录美好生活.txt
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
DouYin/Transcripts/深度解读!什么是现货电价?#电力 #储能 #电价_b28173fe.txt
Normal file
1
DouYin/Transcripts/深度解读!什么是现货电价?#电力 #储能 #电价_b28173fe.txt
Normal file
@@ -0,0 +1 @@
|
||||
觉得现货电价很神秘,其实它就像电力系统的智能导航,随时反映不同时段的用电紧张程度。用电高峰时电价升高,提醒大家节约用电,用电。低谷时电价降低,鼓励放心用电,这样既经济实惠又保障电网稳定运行。这种定价方式并非随意设定,而是电力系统多年运行经验与现代技术深度融合的成果。每天电力市场会通过精准计算确定哪些发电机组启动发多少电。各机组在根据实时用电需求竞争报价,谁更清洁、更灵活,成本更低,谁就优先供电。由于每个时段的工序情况不同,竞争结果也随之变化,电价因此实时波动,形成了我们所说的现货电价。简而言之,现货电价是电力市场智慧的体现,它用灵活的价格信号引导发电与用电,让电力系统更安全、更高效、更利索。
|
||||
@@ -1,3 +1,11 @@
|
||||
|
||||
5.84 vfb:/ 11/01 P@X.mQ 复制打开抖音极速版,看看【特哥来电的作品】# 新能源充电桩 # 新能源汽车 # 电价 # 汉... https://v.douyin.com/CRVXcWcXj40/
|
||||
|
||||
4.84 12/16 WzT:/ I@V.lC 复制打开抖音极速版,看看【售电小蛮腰的作品】国家电网直接降电费多省事?为什么非要搞售电公司来绕... https://v.douyin.com/-x8xMg-rke8/
|
||||
|
||||
5.61 uFH:/ R@K.jc 08/17 复制打开抖音极速版,看看【耀昇集团的作品】电力现货交易:随机波动,持续运行# 售电 # 电改... https://v.douyin.com/wjnXK8g9K7s/
|
||||
|
||||
|
||||
3.00 12/28 d@n.dN VYZ:/ 复制打开抖音极速版,看看【聚合能研的作品】2026年,电力市场的 “大洗牌” 正式开始 告别... https://v.douyin.com/gHWfWVgDVRo/
|
||||
|
||||
8.76 TYZ:/ p@d.Nw 06/06 复制打开抖音极速版,看看【东哥新能源real的作品】峰谷平电价取消 灵活分时电价将全面替代划定分时电价... https://v.douyin.com/w3LQC4t1f2A/
|
||||
@@ -8,12 +16,6 @@
|
||||
|
||||
9.43 12/11 b@A.gb cAt:/ 复制打开抖音极速版,看看【华电丹姐说电力的作品】必须认真听的136号文详细解读!# 知识分享 # ... https://v.douyin.com/_TFLCp9kwKw/
|
||||
|
||||
5.84 vfb:/ 11/01 P@X.mQ 复制打开抖音极速版,看看【特哥来电的作品】# 新能源充电桩 # 新能源汽车 # 电价 # 汉... https://v.douyin.com/CRVXcWcXj40/
|
||||
|
||||
4.84 12/16 WzT:/ I@V.lC 复制打开抖音极速版,看看【售电小蛮腰的作品】国家电网直接降电费多省事?为什么非要搞售电公司来绕... https://v.douyin.com/-x8xMg-rke8/
|
||||
|
||||
5.61 uFH:/ R@K.jc 08/17 复制打开抖音极速版,看看【耀昇集团的作品】电力现货交易:随机波动,持续运行# 售电 # 电改... https://v.douyin.com/wjnXK8g9K7s/
|
||||
|
||||
4.64 C@u.se 05/20 pqR:/ 复制打开抖音极速版,看看【晓莹她与电的那些事儿的作品】国家能源局关于电力市场典型违规问题的通报!# 全国... https://v.douyin.com/N_2XTr-C93g/
|
||||
|
||||
5.33 zGi:/ N@w.sR 11/24 复制打开抖音极速版,看看【高照-企业智库的作品】售电公司是什么?售电政策红利 # 售电# 售电居间... https://v.douyin.com/aSE5j289oPM/
|
||||
|
||||
35
DouYin/debug_asr_client.py
Normal file
35
DouYin/debug_asr_client.py
Normal file
@@ -0,0 +1,35 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
|
||||
# Ensure project root is in path
|
||||
sys.path.append(r"d:\dsWork\aiData")
|
||||
from Util.ASRClient import ASRClient
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', stream=sys.stdout)
|
||||
logger = logging.getLogger("DebugASR")
|
||||
|
||||
def debug():
|
||||
file_path = r"d:\dsWork\aiData\DouYin\Audios\政策深度解读:取消行政分时电价,为何是电力市场化的灵魂一步 #新能源 #综合能碳 #电力市场 #马哥能源频道_1589c43b.mp3"
|
||||
|
||||
logger.info(f"Testing ASRClient with file: {file_path}")
|
||||
|
||||
try:
|
||||
client = ASRClient()
|
||||
text = client.transcribe_file_sync(file_path)
|
||||
|
||||
if text:
|
||||
logger.info("Transcription successful!")
|
||||
logger.info(f"Length: {len(text)}")
|
||||
output_path = r"d:\dsWork\aiData\DouYin\Transcripts\debug_output.txt"
|
||||
with open(output_path, 'w', encoding='utf-8') as f:
|
||||
f.write(text)
|
||||
else:
|
||||
logger.error("Transcription returned None")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fatal error: {str(e)}", exc_info=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
debug()
|
||||
89
DouYin/init_db.py
Normal file
89
DouYin/init_db.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import sys
|
||||
import os
|
||||
# Add project root to path
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
import pymysql
|
||||
from Config.Config import DORIS_HOST, DORIS_PORT, DORIS_USER, DORIS_PWD, DORIS_DATABASE
|
||||
|
||||
def init_db():
|
||||
print(f"Connecting to {DORIS_HOST}:{DORIS_PORT}...")
|
||||
try:
|
||||
conn = pymysql.connect(
|
||||
host=DORIS_HOST,
|
||||
port=DORIS_PORT,
|
||||
user=DORIS_USER,
|
||||
password=DORIS_PWD,
|
||||
database=DORIS_DATABASE,
|
||||
charset='utf8mb4'
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
|
||||
sql = """
|
||||
CREATE TABLE IF NOT EXISTS t_douyin_record (
|
||||
id VARCHAR(50) NOT NULL COMMENT "UUID",
|
||||
video_name VARCHAR(500) COMMENT "视频名称",
|
||||
original_text TEXT COMMENT "原始粘贴文本",
|
||||
obs_url VARCHAR(500) COMMENT "OBS视频链接",
|
||||
transcript TEXT COMMENT "文案内容",
|
||||
status VARCHAR(20) COMMENT "状态: PROCESSING, COMPLETED, FAILED",
|
||||
create_time DATETIME COMMENT "创建时间"
|
||||
)
|
||||
UNIQUE KEY(id)
|
||||
DISTRIBUTED BY HASH(id) BUCKETS 1
|
||||
PROPERTIES (
|
||||
"replication_allocation" = "tag.location.default: 1"
|
||||
);
|
||||
"""
|
||||
# Note: replication_num is deprecated in newer Doris, using replication_allocation.
|
||||
# If it fails, I will revert to replication_num.
|
||||
|
||||
print("Executing CREATE TABLE...")
|
||||
cursor.execute(sql)
|
||||
print("Table t_douyin_record created (or already exists).")
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
# Try with replication_num if allocation fails
|
||||
if "replication_allocation" in str(e):
|
||||
print("Retrying with replication_num...")
|
||||
try:
|
||||
conn = pymysql.connect(
|
||||
host=DORIS_HOST,
|
||||
port=DORIS_PORT,
|
||||
user=DORIS_USER,
|
||||
password=DORIS_PWD,
|
||||
database=DORIS_DATABASE,
|
||||
charset='utf8mb4'
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
sql = """
|
||||
CREATE TABLE IF NOT EXISTS t_douyin_record (
|
||||
id VARCHAR(50) NOT NULL COMMENT "UUID",
|
||||
video_name VARCHAR(500) COMMENT "视频名称",
|
||||
original_text TEXT COMMENT "原始粘贴文本",
|
||||
obs_url VARCHAR(500) COMMENT "OBS视频链接",
|
||||
transcript TEXT COMMENT "文案内容",
|
||||
status VARCHAR(20) COMMENT "状态: PROCESSING, COMPLETED, FAILED",
|
||||
create_time DATETIME COMMENT "创建时间"
|
||||
)
|
||||
UNIQUE KEY(id)
|
||||
DISTRIBUTED BY HASH(id) BUCKETS 1
|
||||
PROPERTIES (
|
||||
"replication_num" = "1"
|
||||
);
|
||||
"""
|
||||
cursor.execute(sql)
|
||||
print("Table t_douyin_record created with replication_num.")
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
except Exception as e2:
|
||||
print(f"Retry Error: {e2}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
init_db()
|
||||
38
DouYin/run_transcription_loop.py
Normal file
38
DouYin/run_transcription_loop.py
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import sys
|
||||
|
||||
def run_loop():
|
||||
audio_dir = r"d:\dsWork\aiData\DouYin\Audios"
|
||||
transcript_dir = r"d:\dsWork\aiData\DouYin\Transcripts"
|
||||
script_path = r"d:\dsWork\aiData\DouYin\transcribe_videos.py"
|
||||
|
||||
while True:
|
||||
# Get list of mp3s
|
||||
mp3s = [f for f in os.listdir(audio_dir) if f.endswith(".mp3")]
|
||||
# Get list of txts
|
||||
if os.path.exists(transcript_dir):
|
||||
txts = [f for f in os.listdir(transcript_dir) if f.endswith(".txt")]
|
||||
else:
|
||||
txts = []
|
||||
|
||||
print(f"Progress: {len(txts)}/{len(mp3s)}")
|
||||
|
||||
if len(txts) >= len(mp3s):
|
||||
print("All files processed!")
|
||||
break
|
||||
|
||||
print("Running transcribe_videos.py...")
|
||||
result = subprocess.run([sys.executable, script_path], capture_output=True, text=True)
|
||||
print(result.stdout)
|
||||
print(result.stderr)
|
||||
|
||||
# Check if we are making progress?
|
||||
# If we loop too fast without progress, we should stop.
|
||||
# But for now, let's just loop.
|
||||
time.sleep(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_loop()
|
||||
@@ -1,18 +1,18 @@
|
||||
|
||||
import os
|
||||
import asyncio
|
||||
import logging
|
||||
import sys
|
||||
import time
|
||||
|
||||
# Ensure project root is in path
|
||||
sys.path.append(r"d:\dsWork\aiData")
|
||||
from Util.ASRClient import ASRClient
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', stream=sys.stdout)
|
||||
logger = logging.getLogger("Transcriber")
|
||||
|
||||
async def transcribe_all():
|
||||
def transcribe_all():
|
||||
audio_dir = r"d:\dsWork\aiData\DouYin\Audios"
|
||||
transcript_dir = r"d:\dsWork\aiData\DouYin\Transcripts"
|
||||
|
||||
@@ -22,6 +22,8 @@ async def transcribe_all():
|
||||
client = ASRClient()
|
||||
|
||||
files = [f for f in os.listdir(audio_dir) if f.endswith(".mp3")]
|
||||
# Sort files to ensure deterministic order
|
||||
files.sort()
|
||||
logger.info(f"Found {len(files)} audio files.")
|
||||
|
||||
for filename in files:
|
||||
@@ -41,8 +43,8 @@ async def transcribe_all():
|
||||
logger.info(f"Processing: {filename}")
|
||||
|
||||
try:
|
||||
# Direct local file transcription using Recognition API
|
||||
text = await client.transcribe_file(audio_path)
|
||||
# Direct local file transcription using synchronous method
|
||||
text = client.transcribe_file_sync(audio_path)
|
||||
|
||||
if text:
|
||||
with open(txt_path, 'w', encoding='utf-8') as f:
|
||||
@@ -50,13 +52,16 @@ async def transcribe_all():
|
||||
logger.info(f"Saved transcript to: {txt_filename}")
|
||||
else:
|
||||
logger.error(f"Failed to transcribe: {filename}")
|
||||
|
||||
# Add a small delay between files
|
||||
time.sleep(1)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error processing {filename}: {str(e)}", exc_info=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
asyncio.run(transcribe_all())
|
||||
transcribe_all()
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Stopped by user")
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user