Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

还没有开源实时流吗?在不开源我要开源我的自己写的接的实时流了 #103

Open
lin-jj-engine opened this issue Dec 16, 2024 · 27 comments

Comments

@lin-jj-engine
Copy link

No description provided.

@gg22mm
Copy link

gg22mm commented Dec 16, 2024

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

@lin-jj-engine
Copy link
Author

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

@cacard
Copy link

cacard commented Dec 17, 2024

你先画个流程图

@gg22mm
Copy link

gg22mm commented Dec 17, 2024

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

@lin-jj-engine
Copy link
Author

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

@xiaomaofei
Copy link

支持。目前这个是不是不能训练泛型呀。只能是单个人的。

@gg22mm
Copy link

gg22mm commented Dec 17, 2024

可以发个最原始的demo过来看看,怎么处理视频音频同步的。 以下是我之前写的,感觉有问题,就没再研究

yongen_diy.wav
1.mp4
wav_mp4.zip

#代码如下:

import cv2
import numpy as np
import queue
import threading
import time

from pydub import AudioSegment 
import simpleaudio as sa


# 模拟音频帧生成
def generate_audio_frames(audio_queue):
    
    # 加载音频文件
    audio = AudioSegment.from_file("yongen_diy.wav")#("yongen_diy.wav", format="wav") #("1.mp3", format="mp3")
   
    # 转换为 numpy 数组
    samples = np.array(audio.get_array_of_samples())

    # 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
    frame_rate = audio.frame_rate  # 24000
    frame_duration_ms = 100         # 每帧 25 毫秒
    frame_size = int(frame_duration_ms * frame_rate / 1000)  # 计算每帧的样本数,其中 1000 为毫秒也就是1秒 最后 * 比例
    # print(frame_size) #600
    
    # 分割音频为帧
    for i in range(0, len(samples), frame_size): #输出0-len(samples)的数据,间隔步长为:frame_size 
        frame = samples[i:i + frame_size]
        # print( str(i)+':'+ str(i+frame_size) ) # 0:600 600:1200 1200:1800 1800:2400
       
        if len(frame) == frame_size:  # 确保每个帧的长度一致 600 600
            audio_queue.put(frame)
            # time.sleep(0.02)  # 模拟音频帧率 50fps

# 模拟视频帧生成
def generate_video_frames(video_queue):
    cap = cv2.VideoCapture("1.mp4")
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        video_queue.put(frame)
        # time.sleep(0.04)  # 模拟视频帧率 25fps
    cap.release()

# 处理同步的音频和视频帧
def process_frames(audio_queue, video_queue):
    while True:
        audio_frame = audio_queue.get()
        video_frame = video_queue.get()

        # 在这里处理音频和视频帧
        print(f"Audio data shape: {audio_frame.shape}, Video frame shape: {video_frame.shape}")

        # 显示视频帧
        cv2.imshow('Video', video_frame)        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        # 播放声音          
        frame_rate = 24000  # 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
        play_audio_frame(audio_frame, frame_rate)


# 播放音频帧
def play_audio_frame(frame, sample_rate):
    # 将 numpy 数组转换为字节
    audio_bytes = frame.astype(np.int16).tobytes()
    
    # 创建一个简单的音频对象并播放
    wave_obj = sa.WaveObject(audio_bytes, 1, 2, sample_rate)
    play_obj = wave_obj.play()
    play_obj.wait_done()  # 等待播放完成


# 主函数
def main():
    audio_queue = queue.Queue(maxsize=10)
    video_queue = queue.Queue(maxsize=10)

    audio_thread = threading.Thread(target=generate_audio_frames, args=(audio_queue,))
    video_thread = threading.Thread(target=generate_video_frames, args=(video_queue,))
    process_thread = threading.Thread(target=process_frames, args=(audio_queue, video_queue))

    audio_thread.start()
    video_thread.start()
    process_thread.start()

    audio_thread.join()
    video_thread.join()
    process_thread.join()

if __name__ == "__main__":
    main()

@LvHuaiSheng
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

请问可以把这部分开源出来吗

@kongshanguyu
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

1 similar comment
@Chengyang852
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

@JerryDaHeLian
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

多,赶紧搞!

@lin-jj-engine
Copy link
Author

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

需要代码的留一下邮箱,我已经接入webrtc了

@lin-jj-engine
Copy link
Author

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

留一下邮箱

@Zhao-Xinda
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

留一下邮箱

[email protected]
求一份代码,感谢感谢,以及你们的测试效果好么

@Searching17
Copy link

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

留一下邮箱

[email protected] 求代码,感谢

@gg22mm
Copy link

gg22mm commented Jan 3, 2025

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

留一下邮箱

[email protected] 代码借鉴一下看看,跟我上面那么简单好理解不?

@gg22mm
Copy link

gg22mm commented Jan 3, 2025

yongen_diy.wav
1.mp4
wav_mp4.zip

#我的这个声音与视频已经同步了,但是有一点遗憾,不知为什么,声音一断一断的,感觉被强行分割一样~~。 不知道是不是simpleaudio的问题

import cv2
import numpy as np
import queue
import threading
import queue
import torch
import cv2

from pydub import AudioSegment 
import simpleaudio as sa 


# 假设我们有一个视频文件和一个音频文件
audio_path = 'yongen_diy.wav'
video_path = '1.mp4'
 
# 创建两个队列,一个用于视频帧,一个用于音频样本
video_queue = queue.Queue(maxsize=500)
audio_queue = queue.Queue(maxsize=500)


# 模拟音频帧生成
def load_audio(audio_path):
    
    # 加载音频文件
    audio = AudioSegment.from_file(audio_path)#("yongen_diy.wav", format="wav") #("1.mp3", format="mp3")
   
    # 转换为 numpy 数组
    samples = np.array(audio.get_array_of_samples())
    frame_rate = audio.frame_rate  # 44100 意思是:每秒采样44100次
    frame_size=frame_rate//25 #一秒声音分担到25张图片上。 # 44100 意思是:每秒采样44100次    
    
    # 分割音频为帧
    for i in range(0, len(samples), frame_size): #输出0-len(samples)的数据,间隔步长为:frame_size 
        frame = samples[i:i + frame_size]
        # print( str(i)+':'+ str(i+frame_size) ) # 0:600 600:1200 1200:1800 1800:2400
       
        if len(frame) == frame_size:  # 确保每个帧的长度一致 600 600
            audio_queue.put(frame)
            # time.sleep(0.02)  # 模拟音频帧率 50fps

# 模拟视频帧生成 - 每秒25帧
def load_video(video_path):
    cap = cv2.VideoCapture(video_path)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        if not video_queue.full():
            video_queue.put(frame)  # 将视频帧放入队列

 
# 创建线程来加载数据
video_thread = threading.Thread(target=load_video, args=(video_path,))
audio_thread = threading.Thread(target=load_audio, args=(audio_path,))
 
video_thread.start()
audio_thread.start()


# 播放音频帧
def play_audio_frame(frame, sample_rate):
    # 将 numpy 数组转换为字节
    audio_bytes = frame.astype(np.int16).tobytes()
    
    # 创建一个简单的音频对象并播放
    wave_obj = sa.WaveObject(audio_bytes, 1, 2, sample_rate)
    play_obj = wave_obj.play()
    play_obj.wait_done()  # 等待播放完成


# 主循环,从队列中取出数据进行处理
while True:
    try:
        video_frame = video_queue.get(timeout=1)  # 从视频队列中取帧
        audio_frame = audio_queue.get(timeout=1)  # 从音频队列中取样本

        print(f"Audio data shape: {audio_frame.shape}, Video frame shape: {video_frame.shape}")
 
        # 对视频帧和音频样本进行处理,例如:
        # 1. 预处理视频帧
        # 2. 预处理音频样本
        # 3. 将处理后的数据送入模型

        # 显示视频帧
        cv2.imshow('Video', video_frame)        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        # 播放声音          
        frame_rate = 24000  # 设置每帧的样本数(假设采样率为 44100 Hz,每帧 25 帧)
        play_audio_frame(audio_frame, frame_rate)

 
        # 处理完毕后,可以选择释放内存
        video_queue.task_done()
        audio_queue.task_done()
 
    except queue.Empty:
        # 如果队列为空,可以选择退出循环或者继续等待
        break
 
# 等待所有任务完成
video_thread.join()
audio_thread.join()

@lin-jj-engine
Copy link
Author

太多人要了,你们加我吧,项目还是辛苦研发了很久,接入了gpt-sovits,webrtc,请喝杯咖啡不过分吧,项目已提交github,下单后分享私密项目,欢迎各位扫码下单,有需要的来
微信图片_20250103174308

@lin-jj-engine
Copy link
Author

image

@lin-jj-engine
Copy link
Author

default.mp4

视频演示,实测GTX1050 ,4G显卡,显卡好跑的更快,跟图片的清晰度也有关系,测过480p可以流畅跑,基本可实时

@lin-jj-engine
Copy link
Author

技术细节加q3995830564

@min-star
Copy link

min-star commented Jan 4, 2025

已有开源实现,让我们拥抱开源,让技术更加开放https://github.com/lipku/LiveTalking

@gg22mm
Copy link

gg22mm commented Jan 5, 2025

default.mp4

视频演示,实测GTX1050 ,4G显卡,显卡好跑的更快,跟图片的清晰度也有关系,测过480p可以流畅跑,基本可实时

大老有没有 websocket版? 不用webrtc,图片我发现我可以推过去,但是声音还不知道怎么推过去~~

图片
图片

@lin-jj-engine
Copy link
Author

default.mp4
视频演示,实测GTX1050 ,4G显卡,显卡好跑的更快,跟图片的清晰度也有关系,测过480p可以流畅跑,基本可实时

大老有没有 websocket版? 不用webrtc,图片我发现我可以推过去,但是声音还不知道怎么推过去~~

图片 图片

没有,到时候可以研究一下

@lin-jj-engine
Copy link
Author

已有开源实现,让我们拥抱开源,让技术更加开放https://github.com/lipku/LiveTalking

是的,不过这个显存占用还是蛮高的,有条件的,重量级的完全推荐用这个

@kongshanguyu
Copy link

[email protected] 求代码,感谢

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

需要代码的留一下邮箱,我已经接入webrtc了

[email protected] 求一份

@lin-jj-engine
Copy link
Author

[email protected] 求代码,感谢

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

需要代码的留一下邮箱,我已经接入webrtc了

[email protected] 求一份

[email protected] 求代码,感谢

这个跟模型没有关系,作者还是所精力用到优化模型上,这个才是最重要的技术。因为时时流要用到队列, 做起来只是繁琐,不难。稍微懂点python都会,可以找个开发我觉得

用队列也不繁琐啊,就是一直推呗,没图片帧就推一段默认的静音视频就好了,参考livingtalk做的

不麻烦你来试一下,各种不兼容够你吃苦头的~~

我已经做完了啊,有demo了,看看需要的人多我就自己搞个项目

求一份代码

需要代码的留一下邮箱,我已经接入webrtc了

[email protected] 求一份

加q

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests