Django集成gTTS做文本转音频时报gTTS.say(text) takes string错误如何解决
错误原因
你遇到的报错核心是gTTS.say()方法的text参数仅接收字符串类型输入,但你传入了列表类型的全局变量textForTts。同时全局存储文本的方案存在逻辑问题:Django运行时全局变量会被所有用户共享,多用户访问时会出现输入串扰,且GET请求下没有任何文本输入时也会调用音频生成逻辑,属于无效调用。
修复步骤
- 移除全局的
textForTts列表,不需要存储历史输入的场景下直接使用表单提交的字符串即可,如需拼接多次输入再转换,可将列表拼接为字符串后传入。 - 调整视图逻辑,仅在POST请求且表单验证通过后再调用音频生成方法,避免无效调用。
- 模板中增加非空判断,没有生成音频时不渲染audio标签,避免页面加载时报控件异常。
修复后的views.py代码
from django import forms from django.shortcuts import render # 请确保你已经正确导入gTTS的say方法 class UploadFileForm(forms.Form): tts = forms.CharField(label = "Convert text to audio here") def index(request): obj = None if request.method == "POST": form = UploadFileForm(request.POST) if form.is_valid(): tts_text = form.cleaned_data["tts"] # 直接传入字符串类型的用户输入 obj = say(language='en-us', text=tts_text) return render(request,'demo/website.html',{ "form" : UploadFileForm(), 'obj':obj })
如果需要拼接多次输入的文本再生成音频,可以修改视图逻辑如下:
def index(request): obj = None # 用session存储当前用户的历史输入,避免全局变量串扰 if 'text_history' not in request.session: request.session['text_history'] = [] if request.method == "POST": form = UploadFileForm(request.POST) if form.is_valid(): tts_text = form.cleaned_data["tts"] request.session['text_history'].append(tts_text) request.session.modified = True # 拼接所有历史输入为字符串 full_text = ' '.join(request.session['text_history']) obj = say(language='en-us', text=full_text) return render(request,'demo/website.html',{ "form" : UploadFileForm(), 'obj':obj })
修复后的index.html代码
{% block body %} {% load gTTS %} <form method="post"> {% csrf_token %} {% if obj %} <audio src = "{{obj}}" controls ></audio> {% endif %} {{form}} <input type = "submit"> </form> {% endblock %}
内容的提问来源于stack exchange,提问作者Shreyashi
相关产品推荐
相关产品推荐

